VideoView以及Surface+MediaPlayer播放視訊RAW下視訊方式
一:首先講VideoView
1videoView的第一種播放方式: videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.ceshi));//ceshi是在RAW目錄下的mp4視訊
videoView.start();
2 videoview的第二種播放方式:
//輸入流
InputStream in = getApplicationContext().getResources().openRawResource(R.raw.ceshi);
//輸出流
OutputStream out = new FileOutputStream(“要寫入到sd卡的路徑videoPath”);
//將資原始檔welcome_media.mp4寫入到sd卡
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
out.flush(); //重新整理
out.close(); //關閉
in.close();
File file = new File(videoPath);
if (!file.exists()){
Log.i("MainActivity0", "視訊檔案不存在");
}else {
videoView.setVideoPath(file.getPath());//這個API播放的是sd卡上的視訊
//迴圈播放
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true);
}
});
videoView.start();
}
二:SurfaceView+MediaPlayer播放視訊
sv = (SurfaceView) findViewById(R.id.sv);
//Surface視訊播放
holder = sv.getHolder();// 得到SurfaceView的容器,介面內容是顯示在容器裡面的。
// 過時的api,必須寫,如果4.0以上的系統,不寫完全沒問題, 4.0一下的系統必須要寫
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// surfaceView 被建立是需要花費一定的時間的。
// 在oncreate方法執行的時候 surfaceViewHolder還沒有完全創建出來。
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceview 的holder被銷燬了。");
position = mediaplayer.getCurrentPosition();// 記錄上次播放的位置,然後停止。
mediaplayer.stop();
mediaplayer.release();
mediaplayer = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
System.out.println("surfaceview 的holder被建立好了");
try {
// InputStream in = getApplicationContext().getResources().openRawResource(R.raw.ceshi);//如果需要將視訊儲存到本地sd卡上,可以用這個方法來獲取到流
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(R.raw.ceshi);//獲取raw下的視訊檔案 ;
mediaplayer = new MediaPlayer();
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaplayer.setDataSource(/*"/sdcard/ceshi.mp4"*/afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());//引數裡的註釋是直接播放sd卡上的視訊
mediaplayer.setDisplay(holder);
mediaplayer.prepareAsync();
mediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Intent intent = new Intent(mContext, GuideActivity.class);
startActivity(intent);
finish();
}
});
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaplayer.start();
if (position > 0) {
mediaplayer.seekTo(position);
}
}
});
} catch (Exception e) {
System.out.println("surfaceview--失敗:");
Toast.makeText(mContext, "播放失敗", 0).show();
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
System.out.println("surface view的大小發生變化。");
}
});