AndroidHTTP边下边播

本文简单地分享一下在Android平台做HTTP边下载边播放的一些经验,希望对初学者有所帮助。

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了龙山免费建站欢迎大家使用!

1. 为什么播放器在播放视频文件的时候,都知道该怎么去解码、该以怎样的时间间隔去显示每一帧呢?

因为无论是mp4、avi、flv、mkv还是其他格式的音视频文件,都存在一个称为metadata的数据块,记录了当前文件的图像尺寸、编码格式、帧率、码率等信息,播放器可以通过解析metadata得到这些信息。

2. 迅雷边下边播的原理是怎样的?

迅雷在边下边播的时候,不会像往常一样根据资源链接数优先排序进行乱序下载,而是会首先去下载含有metedata的数据块,从而配置好×××和显示间隔等逻辑,然后保证至少有一个线程顺序地获取/下载即将播放的数据块,从而实现边下边播。

3. Android中如何实现边下边播?

Android的VideoView是支持http协议的边下边播的,只需要将远程http服务器上的视频文件的HTTP URL地址通过 VideoView.setVideoPath 传进去,start之后VideoView就会直接边下载边解码播放了。

不过VideoView支持的视频格式有限,一般只支持mp4、3gp、avi格式

因此,你也可以直接通过"HTTP GET"请求进行文件下载,得到文件的metedata之后,解析出该文件的编码、帧率等信息(例如:mp4码流的话,可以通过《Android中如何提取和生成mp4文件》这篇文章提供的方法进行音视频数据的解耦),然后边下载边送入软/硬×××进行解码,最后通过SurfaceView将解码后的数据显示出来,比较复杂,相当于自己做流媒体播放器了。

4. 需要注意的坑

(1) 不是所有的mp4文件都支持通过HTTP协议边下边播,因为有的mp4文件的metadata数据块在文件尾部,只有下载完整个文件之后才能成功解析。

注:对于metadata数据块在文件尾部的mp4文件,可以通过ffmpeg的qt-faststart工具来转换,或者直接使用如下ffmpeg命令将metadata转移到文件头部,从而支持边下载边播放。

ffmpeg -i input.mp4 -movflags faststart output.mp4

(2)如果自己通过http GET请求边下载边解码播放的话,则需要注意,音视频数据的实时传输显示与普通文件的传输有很大的不同,接收到文件数据流可以立马写磁盘,但是接收到一帧音视频数据则必须根据时间戳来决定何时送入×××解码以及显示,没到时间,就得sleep,否则的话,播放过程会因为网络抖动而出现卡顿现象。

注:一般情况下,两帧视频的时间间隔 = 1000/帧率

5. 小结

关于Android中做HTTP边下边播的一些经验就分享到这里了,有任何疑问或者建议欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。


当前名称:AndroidHTTP边下边播
文章链接:http://pwwzsj.com/article/jeppgi.html