【发布时间】:2015-10-02 08:50:37
【问题描述】:
我使用SurfaceView 和MediaPlayer 流式传输来自RTSP 和MJPEG 的视频,这两种协议独立工作,即当我仅从RTSP 或MJPEG over HTTP 流式传输时。我遇到的问题是,当我尝试从 MJPEG 协议切换到另一个协议时,prepare() 方法会抛出 IllegalStateException。
对于 RTSP 流,我使用 MediaPlayer 类,因为它默认支持 RTSP 流。对于MJPEG,我有一个AsyncTask,它调用一个HTTP url 并返回JPEG,我用它来设置SurfaceViews SurfaceHolderCanvas。我认为当我尝试解锁 SurfaceHolder Canvas 时问题出在某个地方
我尝试将流从 MJPEG 更改为 RTSP 的第一步:
MjpegThread.isRunning = false;
mediaPlayer.release();
mediaPlayer = null;
setMediaPlayer();
MjpegThread 是AsyncTask,它在我调用的doInBackground 方法结束时停止AsyncTask 后发出HTTP 请求并更新SurfaceHolders Canvas
surfaceHolder.unlockCanvasAndPost(canvas);
该过程的最后一步是显示 RTSP 流,这是我的代码:
mediaPlayer.setDisplay(vidHolder);
mediaPlayer.setDataSource(OZOptions.RTSP_URL);
mediaPlayer.prepare(); // <- IllegalStateException HERE
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
上面的代码在我最初使用RTSP bot 时有效,而不是当我从MJPEG 切换到RTSP 时。
【问题讨论】:
标签: java android multithreading android-mediaplayer surfaceview