Android 4.0.4 MediaPlayer 使用 RTSP url 准备问题

2024-02-07

我正在开发的视频流应用程序遇到了一个奇怪的问题。实际的视频/音频流在我的所有测试设备上都运行良好。然而,在看似任何 4.0+ 的设备上,当使用 RTSP URL 时,prepare() 会立即返回(这会导致在加载视频时向用户提供正确反馈的问题,并干扰我现有的一些其他系统)。

下面是我初始化和设置 MediaPlayer 的代码块,但请记住以下几点:

  • 我的 initPlayer 方法是从 AsyncTask 调用的。
  • 视频最终确实可以正确播放,但立即准备返回会导致在视频加载期间缺乏对用户的反馈。
  • 整个过程没有出现任何错误
  • start() 是通过 OnPreparedListener 中的 onPrepared 方法在 MediaPlayer 上调用的,这显然会成为一个问题,因为在准备好播放之前就返回了 prepare() 。
  • HTTP 流似乎工作正常,并且在低于 4.0 的每个测试设备上都不会出现此问题。

我花了很长一段时间试图解决这个问题,但找不到其他人遇到过这个问题。任何想法将不胜感激。

    public void initPlayer() {
        //We first need to make sure the MediaPlayer isn't null
        if(mMediaPlayer==null){
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnPreparedListener(mediaPlayerPreparedListener);
            mMediaPlayer.setOnCompletionListener(mediaPlayerCompletionListener);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        //If a video/stream has been chosen while another is already playing
        else if(mMediaPlayer.isPlaying()){
            mMediaPlayer.reset();
        }
        //Video is not in full screen mode
        second = false;
        try {
            mMediaPlayer.setDataSource(videoString);
            holder = mPreview.getHolder();
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //onPreparedListener
    private OnPreparedListener mediaPlayerPreparedListener = new OnPreparedListener(){
        public void onPrepared(MediaPlayer mp) {
            mp.start();
            vidPb.setVisibility(View.INVISIBLE);
        }
    };

Use mp.prepareAsync() http://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync%28%29因为它更适合流媒体。使用prepare()阻塞,直到 MediaPlayer 准备好播放或发生 IllegalStateException。此外,在 android 4 (ICS) 中,任何 UI 线程上的阻塞更加严格,可能会导致出现 ANR(活动未响应)对话框。

最后一个想法,尽量避免使用e.printStackTrace();在 Android 应用程序中。 相反,使用Log.e("TAG_STRING", e.getMessage(), e);将错误打印到您可以访问的 android 日志系统logcat http://developer.android.com/tools/debugging/ddms.html#logcat.

总而言之,它应该看起来像这样:

    try {
        mMediaPlayer.setDataSource(videoString);
        holder = mPreview.getHolder();
        mMediaPlayer.setDisplay(holder);
        mMediaPlayer.prepareAsync();
    } catch (IllegalArgumentException e) {
        Log.e("TAG_STRING", e.getMessage(), e);
    } catch (SecurityException e) {
        Log.e("TAG_STRING", e.getMessage(), e);
    } catch (IllegalStateException e) {
        Log.e("TAG_STRING", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("TAG_STRING", e.getMessage(), e);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 4.0.4 MediaPlayer 使用 RTSP url 准备问题 的相关文章

随机推荐