SurfaceView + MediaPlayer 实现列表循环播放视频

写在前面的碎碎念

  • 前一阵子终于结完了一个外包,把最后留的视频播放的坑给填上了
  • 本着能用原生组件就不用不第三方组件的愚蠢态度,最后也算是把功能实现了,长时间跑下来也没有问题,放心食用
  • 也是看了不少官方文档和博客,加上是异地协助花了不少时间,不过最后还是把东西整出来了

SurfaceView + MediaPlayer 实现列表循环播放视频

正文

SurfaceView + MediaPlayer

简单介绍一下,了解的可以直接跳过
SurfaceView是一个View组件在XML里面引入,负责把视频播放区域画出来
MediaPlayer是真正的播放对象,存入视频来源、进度、声音大小、视频的宽度大小

这里的视频宽度和SurfaceView的宽度有区别 SurfaceView是画布大小 视频宽度是播放出来有效的大小 可以通过MediaPlayer进行自适应

使用SurfaceView+MediaPlayer播放一个视频的过程是

// player 拿到viewHolder
payer.setDisplay(surfaceView.getHolder());
// 设置来源监听函数等一系列参数
player.setDataSource("视频来源 可为url或者本地地址");
// 设置完成后进入Initialized状态 需要prepare才可以播放
player.prepare();
// 开始播放
player.start();
复制代码

再贴一张生命周期图

具体思路

说一下实现播放列表的第一个思路
每一个播放地址弄一个MediaPlayer
建立一个Map或者List存入这些MediaPlayer
先开始播放第一个视频
另起线程初始化剩下的player 并使用OnCompletionListener监听完成进行播放的自动切换
以此来达到循环的目的

周期上面画的图可以看到一个player播放完成之后进入stoped 不可以调用start()
所以一开始尝试再次prepare()
但是还是播放不出来 就算再调用seekTo(0)
依旧无法播放

于是尝试暴力模式 每次播放完成后
new一个新的Player进行下次播放并替代List里面的对象
一开始认为这样不存在内存泄漏问题会被系统回收
遗漏了一个点 MediaPlayer只有release之后才会被回收
所以跑了一段时间之后就会因为内存泄漏崩掉

顺便插一句
MediaPlayer实际上实现部分是C++代码调用了大量系统资源
最多能有多少并没有给出来但是是有一个上限的
不再使用一定要release释放掉

所以最后的解决方案是
player播放完成后 调用reset()方法进入Idle状态
重新进行参数设置
下次调用依旧是一个新的player并且重复使用了player

具体实现代码

### 回答1: 可以使用以下代码实现MediaPlayer SurfaceView播放视频、暂停播放、停止播放: 播放视频: ``` MediaPlayer mediaPlayer = new MediaPlayer(); SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView); SurfaceHolder surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { mediaPlayer.setDataSource("your_video_path"); mediaPlayer.setDisplay(holder); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // do nothing } @Override public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.release(); } }); ``` 暂停播放: ``` if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } ``` 停止播放: ``` if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } ``` ### 回答2: 使用MediaPlayerSurfaceView播放视频,可以按照以下步骤进行操作: 1. 首先,创建一个MediaPlayer对象和SurfaceView对象,用于控制视频的播放和显示。 2. 设置SurfaceView的回调方法,在回调方法中获取到SurfaceHolder对象,并将其与MediaPlayer对象进行关联。 3. 通过MediaPlayer的setDataSource()方法设置要播放的视频文件的路径。 4. 调用MediaPlayer的prepareAsync()方法进行异步准备,准备完成后触发onPrepared()回调方法。 5. 在onPrepared()方法中,可以调用MediaPlayer的start()方法开始播放视频。 6. 若要暂停播放视频,可以调用MediaPlayer的pause()方法。 7. 若要停止播放视频,可以调用MediaPlayer的stop()方法,并在停止后调用MediaPlayer的release()方法释放资源。 简单的示例代码如下: ```java MediaPlayer mediaPlayer = new MediaPlayer(); SurfaceView surfaceView = findViewById(R.id.surfaceView); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { mediaPlayer.setDisplay(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }); try { mediaPlayer.setDataSource("视频文件路径"); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } }); } catch (IOException e) { e.printStackTrace(); } // 暂停播放 mediaPlayer.pause(); // 停止播放 mediaPlayer.stop(); mediaPlayer.release(); ``` 以上就是使用MediaPlayerSurfaceView播放视频、暂停播放和停止播放的简要步骤。 ### 回答3: 使用MediaPlayer SurfaceView播放视频、暂停播放、停止播放的步骤如下: 1. 创建MediaPlayer对象,并设置其数据源为要播放的视频文件路径或URL。 2. 创建SurfaceView对象,并通过getHolder()方法获取SurfaceHolder对象。 3. 通过SurfaceHolder对象添加回调方法,实现SurfaceHolder.Callback接口的三个方法:surfaceCreated、surfaceChanged和surfaceDestroyed。在surfaceCreated方法中,将SurfaceHolder传给MediaPlayer对象的setDisplay方法。 4. 调用MediaPlayer对象的prepareAsync或prepare方法准备播放。 5. 在MediaPlayer对象准备完成的监听器中,调用MediaPlayer对象的start方法开始播放视频。 6. 若要暂停播放视频,调用MediaPlayer对象的pause方法。 7. 若要停止播放视频,调用MediaPlayer对象的stop方法,并在停止后调用MediaPlayer对象的release方法释放资源。 可以在播放视频之前设置一些附加功能,如设置循环播放、设置音量等。此外,还可以监听MediaPlayer对象的各种事件,如播放完成、缓冲进度等,以便进行相应的处理。 需要注意的是,在使用MediaPlayer SurfaceView播放视频时,可能会涉及到一些多线程的处理。比如,在surfaceCreated方法中设置MediaPlayer对象的setDisplay方法时,MediaPlayer对象可能还未准备好,需要等待MediaPlayer对象准备完成后才能设置。因此,可以通过监听MediaPlayer对象的准备完成事件来确保播放视频SurfaceView已经生成。 以上是通过MediaPlayer SurfaceView播放视频、暂停播放、停止播放的基本步骤,具体实现还需根据需要进行适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值