我正在尝试使用媒体播放器播放资源文件夹中的视频。我先把它复制到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中显示任何错误。我在这里做错了吗?
答案 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);
}
}