Android 4.0.4 MediaPlayer 使用 RTSP 地址准备问题

8
我在处理一个视频流应用程序时遇到了一个奇怪的问题。实际上,在所有测试设备上,视频/音频的流式传输都很好。然而,在任何使用RTSP URL的4.0+设备上,prepare()会立即返回(这会导致在视频加载时无法向用户提供适当的反馈,并干扰我已经放置的一些其他系统)。
下面是我初始化和设置MediaPlayer的代码块,但请记住以下几点:
- 我的initPlayer方法是从AsyncTask中调用的。 - 视频最终会正确播放,但prepare()立即返回会导致在视频加载期间无法向用户提供反馈。 - 整个过程中没有发生任何错误。 - 在我的OnPreparedListener中,通过start()调用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);
        }
    };

我现在也遇到了同样的问题。你解决了吗?如果是,请回答你自己的问题并提供解决方案。等待中...!!! - Quamber Ali
不幸的是,虽然我在相当长的时间内停止了对这个项目的工作,但我从未找到解决方案。 - bread
1个回答

0

使用mp.prepareAsync(),因为它更适合流媒体。使用prepare()会阻塞直到MediaPlayer准备好播放或发生IllegalStateException异常。此外,在Android 4(ICS)中,阻塞任何UI线程甚至更加严格,可能会导致ANR(Activity not responding)对话框出现。

最后一个想法是,尽量避免在Android应用程序中使用e.printStackTrace();。相反,使用Log.e("TAG_STRING", e.getMessage(), e);将错误打印到Android日志系统中,您可以从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);
    }

1
谢谢,Petey。我从AsyncTask中调用prepare,因此它不会阻塞UI线程。尽管如此,我也尝试使用prepareAsync(),但结果相同。 - bread

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接