lea*_*ner 10 video android surfaceview activity-lifecycle textureview
每次我暂停我的活动(实际上是碎片)去另一个应用程序,返回onResume我尝试恢复视频播放,但它不播放:我得到一个空白的屏幕.经过调查,我在Logcat中看到以下内容
E/BufferQueueProducer: [unnamed-23827-0] queueBuffer: BufferQueue has been abandoned
E/MediaPlayer: error (1, -38)
E/MediaPlayer: error (1, -38)
E/MediaPlayer: error (1, -38)
E/MediaPlayer: error (1, -38)
E/BufferQueueProducer: [unnamed-23827-0] connect(P): BufferQueue has been abandoned
Run Code Online (Sandbox Code Playgroud)
这是我在简历中调用的代码
player.seekTo(mVideoSeekPosition);
player.start();
Run Code Online (Sandbox Code Playgroud)
仅供参考:我一直试图将这个答案应用到我的案例中,但我不能:当BufferQueue被放弃后我该怎么办?
UPDATE
我挣扎着独自一人,但我仍在崩溃.所以我发布了整个代码以寻求帮助
private void setupVideoPlayingSystem(View root) {
textureView = (TextureView) root.findViewById(R.id.textureView);?
textureView.setSurfaceTextureListener(this);
}? ? ?
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
Log.d(TAG, "onSurfaceTextureAvailable");
if (null == surface) {
Log.d(TAG, "new surface");
surface = new Surface(surfaceTexture);
mediaPlayer = new MediaPlayer();
mediaPlayer.setSurface(surface);
mediaPlayer.setLooping(false);
}?
/*?
outstandingVideoRequest is IOU for orentation change (verifed: onResume before onSurfaceTextureAvailable)
but for cold startup, must check mVideoUrl
*/?
if (outstandingVideoRequest && null != mVideoUrl) {?
outstandingVideoRequest = false;
? playNewVideo(mVideoUrl);
}?
}? ?
@Override?
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {?
Log.d(TAG, "onSurfaceTextureSizeChanged");
? }? ?
@Override
? public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {?
Log.d(TAG, "onSurfaceTextureDestroyed");
return false;//leave destruction for onDestroy?
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {? }?
private void playNewVideo(String url) {?
if (null == mediaPlayer || null == surface) {?
Log.d(TAG, "playNewVideo not ready");
? synchronized (outstandingVideoRequest) {
? Log.d(TAG, "playNewVideo outstandingVideoRequest");
? outstandingVideoRequest = true;
}?
} else {?
try {?
mediaPlayer.reset();?
mediaPlayer.setDataSource(getContext(), Uri.parse(url));?
mediaPlayer.setLooping(false);?
mediaPlayer.prepareAsync();?
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override?
public void onPrepared(MediaPlayer player) {?
Log.d(TAG, "onPrepared changeMediaPlayerDatasource");?
onReadyToPlay(player);
}?
});?
} catch (Exception e) {//IOException && IllegalStateException?
Log.d(TAG, "textureview playNewVideo ERORR");?
e.printStackTrace();?
}? ?
}?
}
private void resumeVideoUponReturningFromAnotherActivity() {
? if (null == mediaPlayer || null == surface) {
? Log.d(TAG, "resumeVideoUponReturningFromAnotherActivity outstandingVideoRequest");
? outstandingVideoRequest = true;?
} else {?
// playNewVideo(mVideoUrl);
? Log.d(TAG, "resumeVideoUponReturningFromAnotherActivity go NOW");
? mediaPlayer.setSurface(surface);?
onReadyToPlay(mediaPlayer);
? }? ?
}? ?
private void onReadyToPlay(MediaPlayer player) {?
//play video?
mProgressCircle.setVisibility(View.GONE);
? showVideoOverlayChildren();?
if (0 == mVideoSeekPosition) {?
Log.d(TAG, "onReadyToPlay start");
? player.start();
? } else {?
Log.d(TAG, "onReadyToPlay seek");
? player.seekTo(mVideoSeekPosition);?
player.start();
? }?
mHandler.postDelayed(new Runnable() {
? @Override
? public void run() {
? Log.d(TAG, "postDelayed resumeVideo");?
hideVideoOverlayChildren();
? }?
}, Constant.BEFORE_VIDEO_OVERLAY_DISAPPEAR);
? }
? ? private void destroyMediaPlayer() {
? if (null != mediaPlayer) {//move to video todo?
mediaPlayer.stop();
? mediaPlayer.release();?
mediaPlayer = null;
? }?
if (null != surface) {
? surface.release();
? surface = null;?
}?
}? ?
private void pauseVideo() {
? if (null != mediaPlayer) {
? Log.d(TAG, "pause");?
mediaPlayer.pause();
? mVideoSeekPosition = mediaPlayer.getCurrentPosition();
? }?
}
? ? private void stopVideo(){?
if (null != mediaPlayer) {
? Log.d(TAG, "stop video");
? mediaPlayer.pause();
? mVideoSeekPosition = mediaPlayer.getCurrentPosition();
? mediaPlayer.stop();
? }?
}
@Override? public void onResume() {
? super.onResume();
? Log.d(TAG, "onResume");?
mLocalBroadcastManager.registerReceiver(mVideoSelectionReceiver, mVideoSelectedIntentFilter);?
resumeVideoUponReturningFromAnotherActivity();
? ? }
Run Code Online (Sandbox Code Playgroud)
Jok*_*oks 10
我在活动之间切换时遇到了同样的问题,也有MediaPlayer(1971):错误(100,0).通过在onSurfaceTextureDestroyed中添加这些行来解决它
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14590 次 |
| 最近记录: |