MediaPlayer视频未播放

时间:2011-04-01 10:19:33

标签: android media-player

我正在尝试使用媒体播放器播放资源文件夹中的视频。我先把它复制到SD卡上。详细代码如下。

活动

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

布局

<?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>

它没有显示视频,也没有在Logcat中显示任何错误。我在这里做错了吗?

2 个答案:

答案 0 :(得分:7)

mp.setDisplay(holder); 

中添加上述声明
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

这将解决问题。

答案 1 :(得分:0)

在媒体播放器实例上调用mp.setDisplay(holder);方法

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