现在的位置: 首页 > 综合 > 正文

android边缓存边播放mp4

2013年12月05日 ⁄ 综合 ⁄ 共 744字 ⁄ 字号 评论关闭

在做一个新闻系统中间有视频播放的要求,当时想着非常简单,android的mediaplayer封装的非常好了,基本就是做做界面。

界面写好的时候才发现悲剧了,对方服务器是http方式提供的mp4,android死活无法边缓存边播放,缓存到100%才能播放。

在网上找了找资料,网上有个边下载mp3边播放的例子,按照其思路修改后发现mp4在没有完成下载时,播放器仍然无法识别。

只好找了mp4的文档格式来看。mp4文档比较复杂,我用简单的方式描述一下,mp4是很多box的嵌套,最上层box包括ftyp,free,moov,mdat等等,其中moov存放着视频详细描述,算是索引,而mdat存放着视频的具体信息。那么需要播放的时候,先必须拿到moov,在实际的mp4打包中,moov可能被放到了mdat后面,导致了文件不被下载完的时候无法获取moov,而无法边缓存边播放。

问题分析出来了,一种简单的方式就是在服务端重新打包,使用mp4box把moov放到mdat前面。还一种方式就是在客户端进行重新调整下载顺序。

我这里稍微介绍一下在客户端进行重新调整下载顺序的解决思路,我们顺序的读取inputstream,当遇到mdat box时,获取mdat整个包长度,并不下载,直接填入空字节。根据长度跳跃到下一个box,直至遇到 moov。完成了moov后,回头再填写mdat,这时已经可以下载一部分播放一部分了。

顺便贴出对我帮助比较大的两篇文档:

http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html

http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html

感谢同事jerry提供的帮助

抱歉!评论已关闭.