3

Я добавил MediaPlayer в свое приложение. Он работает нормально, но в первый раз, когда я называю свою поверхность, и я инициализирую MediaPlayer, текстура становится видимой, но ее белая, без видео в ней (но звук работает, и мои журналы говорят, что он работает отлично).MediaPlayer не работает в первый раз

После первой попытки он отлично работает. Но я не могу найти причину, почему она не работает в первую очередь. Вот мой код:

///////// 
    mVideoView = (TextureView) mRootView.findViewById(R.id.show_video_content); 
     mVideoView.setSurfaceTextureListener(this); 
//////// 
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
     Log.i(TAG, "InicializoSurface. Width: " + width + " HEIGHT:" + height); 
     Log.i(TAG, "InicializoSurface. Width: " + mVideoView.getMeasuredWidth() + " HEIGHT:" + mVideoView.getMeasuredHeight()); 
     Log.i(TAG, "View transform. Width: " + mVideoView.getWidth() + " HEIGHT:" + mVideoView.getHeight()); 


     mMediaSurface = new Surface(mVideoView.getSurfaceTexture()); 
     initializeMediaPlayer(); 

    } 

    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 

    } 

    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 

     if (mMediaPlayer != null) { 
      // Make sure we stop video and release resources when activity is destroyed. 
      mMediaPlayer.stop(); 
      mMediaPlayer.release(); 
      mMediaPlayer = null; 
     } 
     return false; 
    } 
    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 

    } 

Это мой заказ MediaPlayer и событие, которое я называю, когда я inicializate поверхность:

private class CustomMediaPlayer extends MediaPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener { 

    SurfaceHolder mVideoHolder; 

    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     if (mediaPlayer != null) { 
      mediaPlayer.start(); 
     } 
    } 
    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     Log.i(TAG,"video preparado"); 
     mMediaPrepared = true; 
    } 
} 

private void initializeMediaPlayer(){ 

    mMediaPlayer = new CustomMediaPlayer(); 
    Uri uri = Uri.parse(mCameraDataAdapter.getList().get(0).getPath()); 

    try { 
     mMediaPlayer.setDataSource(mActivity, uri); 
     mMediaPlayer.setSurface(mMediaSurface); 
     mMediaPlayer.prepareAsync(); 
     mMediaPlayer.setOnPreparedListener(mMediaPlayer); 
     mMediaPlayer.setOnCompletionListener(mMediaPlayer); 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


} 

Наконец я называю начало() в моем onDragListener:

 case DragEvent.ACTION_DRAG_STARTED: 

       if (mCameraDataAdapter.getFirstElement().equalsIgnoreCase("video")) { 
        mThumbnailContainer.setVisibility(View.VISIBLE); 
        mVideoView.setVisibility(View.VISIBLE); 


        Log.i(TAG, "X: " + mVideoView.getX() + "Y: " + mVideoView.getY()); 


        if (mVideoView.isAvailable()) { 
         onSurfaceTextureAvailable(mVideoView.getSurfaceTexture(), mVideoView.getWidth(), mVideoView.getHeight()); 
        } 

        if (mMediaPlayer == null) { 
         initializeMediaPlayer(); 
        } 


        if (mMediaPrepared) { 
         Log.i(TAG,"Comienzo Video"); 
         mMediaPlayer.start(); 
        } 

       } else { 
        mThumbnailContainer.setVisibility(View.VISIBLE); 
        mImageContainer.setVisibility(View.VISIBLE); 
       } 
       mPreviewThumbIcon.setVisibility(View.INVISIBLE); 
       return true; 

Я уже пытался изменить свою подготовку() для подготовкиAsync() или использовать всегда «видимое» представление, но я не могу найти причину, по которой он не работает.

спасибо, что заблаговременно!

ответ

3

Сброс MediaPlayer после каждого использования внутри вашего падения & метода Drag: Action_drag_ended:

case DragEvent.ACTION_DRAG_STARTED: 

selected = null; 

if (mCameraDataAdapter.getFirstElement().equalsIgnoreCase("video")) { 

    mImageContainer.setVisibility(View.INVISIBLE); 
    mVideoView.setVisibility(View.VISIBLE); 
    //SurfaceTexture is not called if the Texture is already available, so we call it anyway 
    if (mVideoView.isAvailable()) { 
     onSurfaceTextureAvailable(mVideoView.getSurfaceTexture(), mVideoView.getMeasuredWidth(), mVideoView.getMeasuredHeight()); 
    } 

} else { 
    mVideoView.setVisibility(View.INVISIBLE); 
    mImageContainer.setVisibility(View.VISIBLE); 
} 
mPreviewThumbIcon.setVisibility(View.INVISIBLE); 
return true; 

Кроме того, поставить Mediaplayer.start в пользовательских PreparedListener.

private class CustomMediaPlayer extends MediaPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener { 

@Override 
public void onCompletion(MediaPlayer mediaPlayer) { 
    if (mediaPlayer != null) { 
     mediaPlayer.start(); 
    } 
} 
//We start the video when its available 
@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    Log.i(TAG,"Video Prepare"); 
    mediaPlayer.start(); 
} 
} 

Надеюсь, это поможет вам. Удачи!

+0

Спасибо, помощник! это сработало! –

Смежные вопросы