Android中如何实现边下边播?
1,需流媒体服务器才能支持快进到任意位置断点开始缓冲播放,不然只能在缓冲好的进度内播放。如需要实现快进效果,可在拖动进度到未缓冲区域的时候暂停播放,在缓冲回调中判断缓冲进度和进度条进度再行播放。
2,mediaplayer内部缓冲大小写死了,不可能更改。播放到一定位置才会继续缓冲下面部分。断网后无法继续缓冲
3,后台播放可以加唤醒锁防止休眠停止播放,wifi锁防止wifi断开停止缓冲
4,焦点,监听音频焦点控制暂停和恢复播放
5,最后播放完毕的时间偶尔会达不到总时长,需要在完成监听里纠正
Android的VideoView是支持http协议的边下边播的,只需要将远程http服务器上的视频文件的HTTP URL地址通过 VideoView.setVideoPath 传进去,start之后VideoView就会直接边下载边解码播放了。
不过VideoView支持的视频格式有限,一般只支持mp4、3gp、avi格式
因此,你也可以直接通过"HTTP GET"请求进行文件下载,得到文件的metedata之后,解析出该文件的编码、帧率等信息(例如:mp4码流的话,可以通过《Android中如何提取和生成mp4文件》这篇文章提供的方法进行音视频数据的解耦),然后边下载边送入软/硬解码器进行解码,最后通过SurfaceView将解码后的数据显示出来,比较复杂,相当于自己做流媒体播放器了。
不是所有的mp4文件都支持通过HTTP协议边下边播,因为有的mp4文件的metadata数据块在文件尾部,只有下载完整个文件之后才能成功解析。
注:对于metadata数据块在文件尾部的mp4文件,可以通过ffmpeg的qt-faststart工具来转换,或者直接使用如下ffmpeg命令将metadata转移到文件头部,从而支持边下载边播放。
一些问题:
1,SurfaceHolder.Callback的对显示view的管理。切换后台或者打开其他二级页面的时候,系统会销毁显示画面的view。这时setDisplay(null)防止不必要的error回调,mediaplayer.pause防止正在缓冲过程中,surfaceDestroyed回调,没画面有声音。
2,首次加载视频资源的时候,因为prepareAsync是不可取消的,调release是没用的。防止在prepare过程中切到后台然后缓冲好的时候直接播放了,应该做好pause
3,infolistener中的回调缓冲start和end会短暂循环调用,如果在这里做加载中进度动画开始和暂停会频闪,首次加载的话可以在第一帧回调里再停止缓冲动画
商用级的细节打磨:
github链接:https://github.com/feiyuu/UVideoPlayer
网友评论