MediaPlayer Video not played

2019-08-18 06:48发布

问题:

I am trying to play a video from assets folder using media player. I am copying it on SD card first. The detailed code is as below.

Activity

public class ActivityMediaPlayer extends Activity implements Callback, OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener{
 private SurfaceView mPreview;
 private SurfaceHolder holder;
 private MediaPlayer mMediaPlayer;
 private int mVideoWidth;
 private int mVideoHeight;
 private static final String TAG = "MediaPlayerDemo";
 File fvvVideoFile;

@Override
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle);
    setContentView(R.layout.lt_mediaplayer);         
    mPreview = (SurfaceView) findViewById(R.id.surface);
    holder = mPreview.getHolder();
    holder.addCallback(ActivityMediaPlayer.this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);     


    String FICHIER_BLOW = "testvideo.mp4"; 
    fvvVideoFile=new File(Environment.getExternalStorageDirectory(), FICHIER_BLOW); 

    BufferedOutputStream bufEcrivain;
    try {
        bufEcrivain = new BufferedOutputStream((new FileOutputStream(fvvVideoFile)));
        BufferedInputStream VideoReader = new BufferedInputStream(getResources().getAssets().open("video/testvideo.mp4"));
        byte[] buff = new byte[32 * 1024]; 
        int len; 
        while( (len = VideoReader.read(buff)) > 0 ){ 
            bufEcrivain.write(buff,0,len); 
        } 
        bufEcrivain.flush(); 
        bufEcrivain.close();  
    } 
    catch (FileNotFoundException e) {e.printStackTrace();} 
    catch (IOException e) {e.printStackTrace();}       
}

private void playVideo() {
    try {           
        MediaPlayer mp = new MediaPlayer();
        Uri mpVideo =Uri.fromFile(fvvVideoFile);        
        try {
            mp.setDataSource(ActivityMediaPlayer.this, mpVideo);                
            mp.prepare();           
            }
        catch (IllegalArgumentException e)  {e.printStackTrace();} 
        catch (IllegalStateException e)     {e.printStackTrace();} 
        catch (IOException e)               {e.printStackTrace();}                  

    }catch (Exception e) {
        Log.e(TAG,"error: " + e.getMessage(), e);
    }
}


 public void onPrepared(MediaPlayer mediaplayer) {
        mVideoWidth = mMediaPlayer.getVideoWidth();
        mVideoHeight = mMediaPlayer.getVideoHeight();
        if (mVideoWidth != 0 && mVideoHeight != 0) {
            holder.setFixedSize(mVideoWidth, mVideoHeight);
            mMediaPlayer.start();
        }
    }

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    playVideo();
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {}

@Override
public void onCompletion(MediaPlayer mp) {}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}}

Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

    <SurfaceView android:id="@+id/surface"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">
    </SurfaceView>

</LinearLayout>

It is not displaying the video nor it is showing any error in Logcat. Am I doing something wrong here?

回答1:

mp.setDisplay(holder); 

add the above statement in

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

This will solve the problem.



回答2:

call mp.setDisplay(holder); method on mediaplayer instance

private void playVideo() {
    try {           
        MediaPlayer mp = new MediaPlayer();
        Uri mpVideo =Uri.fromFile(fvvVideoFile);        
        try {
            mp.setDisplay(holder);
            mp.setDataSource(ActivityMediaPlayer.this, mpVideo);                
            mp.prepare();           
            }
        catch (IllegalArgumentException e)  {e.printStackTrace();} 
        catch (IllegalStateException e)     {e.printStackTrace();} 
        catch (IOException e)               {e.printStackTrace();}                  

    }catch (Exception e) {
        Log.e(TAG,"error: " + e.getMessage(), e);
    }
}