BufferQueue aufgegeben wurde: Bei der Wiedergabe von video mit TextureView

Jedes mal, wenn ich pause meine Tätigkeit (tatsächlich Fragment) gehen Sie zu einer anderen app, nach der Rückkehr mit onResume ich versuchen, wieder die video-Wiedergabe, aber es nicht zu spielen: ich bekomme einen leeren Bildschirm. Bei der Untersuchung sehe ich Folgendes im 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

Hier ist der code, den ich anrufen innen bei der Wiederaufnahme der

player.seekTo(mVideoSeekPosition);
player.start();

FYI: ich habe versucht, diese Antworten zu meinem Fall, aber ich kann nicht: Was kann ich tun, wenn die BufferQueue aufgegeben wurde?

UPDATE

Ich mühte mich, es alleine zu machen, aber ich bin immer noch abstürzt. Also ich bin Entsendung der ganze code für die Hilfe

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);
  }}
    
    

@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {Log.d(TAG, "onSurfaceTextureSizeChanged");}
    
    

@Overridepublic 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() {

            @Overridepublic 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() {@Overridepublic 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();}}

@Overridepublic void onResume() {super.onResume();Log.d(TAG, "onResume");
    
    mLocalBroadcastManager.registerReceiver(mVideoSelectionReceiver, mVideoSelectedIntentFilter);
    
    resumeVideoUponReturningFromAnotherActivity();

    
    }
  • Wenn die display-Oberfläche ist Weg, beim Wechsel von Aktivitäten, dann brauchen Sie nennen setDisplay() / setSurface() mit der neuen Oberfläche.
  • Ich kann ' T es herausfinden. Ich legte mediaPlayer.setSurface(surface); Recht vor, die suchen Teil es funktioniert immer noch nicht. Plus ich habe versucht ein paar andere Sachen.
  • Hast du es passieren, eine neue Oberfläche aus der neuen TextureView?
InformationsquelleAutor learner | 2015-10-22
Schreibe einen Kommentar