BufferQueue has been abandoned: When playing video with TextureView
Solution 1
I had the same problem when switched between activities and also had MediaPlayer(1971): Error (100,0). Solved it by adding these lines inside onSurfaceTextureDestroyed
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
return true;
}
Solution 2
I find setSurface(null)
is useful.
If you use a TextureView to display something, when TextureView.SurfaceTextureListener
callback onSurfaceTextureDestroyed
was called, you must stop use SurfaceTexture/new Surface(SurfaceTexture)
binded by camera2
, MediaCodec
or MediaPlayer
.
Like this
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
mediaPlayer.setDisplayer(null);
return false;//do not return true if you reuse it.
}
Related videos on Youtube
learner
Updated on November 22, 2020Comments
-
learner over 3 years
Every time I pause my activity (actually Fragment) to go to another app, upon returning with onResume I try to resume the video playing but it does not play: I get a blank screen. Upon investigation, I see the following in the 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
Here is the code I call inside on resume
player.seekTo(mVideoSeekPosition); player.start();
FYI: I have been trying to apply this answer to my case, but I can't: What can I do when the BufferQueue has been abandoned?
UPDATE
I struggled to go it alone, but I am still crashing. So I am posting the whole code for help
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(); }