MediaPlayer加Surface播放视频

MediaPlayer + SurfaceView 及 VideoView 播放视频
一、说明
  • MediaPlayer:播放视频,使用 setDisplay(Holder holder)向 SurfaceView 中播放。
  • SurfaceView:提供一个窗口播放 Surface,提供 Holder 给 MediaPlayer。
  • VideoView:直接设置源进行播放。
  • 使用资源方法:
    1. MediaPlayer.create(context,R.raw.xxx) 直接获取 MediaPlayer 对象。
    2. Uri.parse(“android.resource://完整项目名(如 com.example.test)/” + R.raw.xxx) 获取 Uri 对象,使用该对象进行资源设置。
    3. 其他方法老爱出问题。
二、MediaPlayer + SurfaceView 播放步骤
  1. 在 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>
  1. 在 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回调
        //设置分辨率
        surfaceView.getHolder().setFixedSize(320,300);
    }
  1. 选择自定义 ViewHolder.CallBack 接口实现或直接在 Activity 实现
@Override
    public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
        //设置播放位置在 SurfaceView 中
        player.setDisplay(surfaceView.getHolder());
        try {
            //设置播放的源文件或 URI 地址
            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;
    }
  1. 在需要播放的位置
if(player != null) {
    player.start();
}
  1. 在 SurfaceHolder.CallBack 回调中释放资源
    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
        player.stop();
        player.release();
        player = null;
    }
三、VideoView 播放视频步骤
  1. 在 layout.xml 使用 或代码自定义
<VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"/>
  1. 在 Activity 中绑定 VideoView,根据需要加不加进度条
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //VideoView 绑定
        videoView = findViewById(R.id.video_view);
        //设置播放源 String 路径,也可设置 URI
        videoView.setVideoPath(path);
        //视频播放进度条
        MediaController videoViewProcessController = new MediaController(this);
        videoView.setMediaController(videoViewProcessController);
    }
  1. 在需要的地方播放或停止
//播放
if(videoView != null && !videoView.isPlaying()) {
    videoView.start();
}
//暂停
if(videoView != null && videoView.isPlaying()) {
    videoView.pause();
}
  1. 释放资源
    @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 存在问题较多,注意
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值