BufferQueue已被放弃:使用TextureView播放视频时

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)