MediaPlayer + SurfaceView 及 VideoView 播放视频
一、说明
- MediaPlayer:播放视频,使用 setDisplay(Holder holder)向 SurfaceView 中播放。
- SurfaceView:提供一个窗口播放 Surface,提供 Holder 给 MediaPlayer。
- VideoView:直接设置源进行播放。
- 使用资源方法:
- MediaPlayer.create(context,R.raw.xxx) 直接获取 MediaPlayer 对象。
- Uri.parse(“android.resource://完整项目名(如 com.example.test)/” + R.raw.xxx) 获取 Uri 对象,使用该对象进行资源设置。
- 其他方法老爱出问题。
二、MediaPlayer + SurfaceView 播放步骤
- 在 layout.xml 中 使用 SurfaceView 标签定义 View。
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"/>
</SurfaceView>
- 在 Activity 中创建 MediaPlayer 和绑定 SurfaceView
private SurfaceView surfaceView;
private MediaPlayer player;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setContentView(R.layout.main_layout);
surfaceView = findViewById(R.id.surface_view);
player = MediaPlayer.create(this,R.raw.xxx);
surfaceView.getHolder().addCallback(this);
surfaceView.getHolder().setFixedSize(320,300);
}
- 选择自定义 ViewHolder.CallBack 接口实现或直接在 Activity 实现
@Override
public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
player.setDisplay(surfaceView.getHolder());
try {
player.setDataSource(this,uri);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
player.stop();
player.release();
player = null;
}
- 在需要播放的位置
if(player != null) {
player.start();
}
- 在 SurfaceHolder.CallBack 回调中释放资源
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
player.stop();
player.release();
player = null;
}
三、VideoView 播放视频步骤
- 在 layout.xml 使用 或代码自定义
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"/>
- 在 Activity 中绑定 VideoView,根据需要加不加进度条
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
videoView = findViewById(R.id.video_view);
videoView.setVideoPath(path);
MediaController videoViewProcessController = new MediaController(this);
videoView.setMediaController(videoViewProcessController);
}
- 在需要的地方播放或停止
if(videoView != null && !videoView.isPlaying()) {
videoView.start();
}
if(videoView != null && videoView.isPlaying()) {
videoView.pause();
}
- 释放资源
@Override
protected void onDestroy() {
super.onDestroy();
if(videoView != null) {
videoView.stopPlayback();
videoView = null;
}
}
四、注意
- 视频资源格式是否支持播放
- URI 是否为视频
- VideoView 资源是否释放
- MediaPlayer 若是使用静态方法 create(context,id)的话不需要 prepare() 初始化,若是使用构造方法 new MediaPlayer() 则需要先进行 prepare() 才可以播放。
- 若是用 URL,该视频需可以渐近式下载。
- 使用本地 res/raw/文件 URI方法:videoView.setVideoURI(Uri.parse(“android.resource://项目全名(例:com.example.test)/” +R.raw.文件名))
- 使用 path 和 URL 存在问题较多,注意