在做一个新闻系统中间有视频播放的要求,当时想着非常简单,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提供的帮助



更多相关文章

  1. Android中的缓存处理
  2. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
  3. 关于android图片的传输,android图片传输方式,xml传输图片,android
  4. Android 不要标题和全屏的设置方式
  5. Android实现推送方式解决方案 (转1)
  6. Android ListView 图片异步加载和图片内存缓存
  7. Android网络编程——https 不验证证书方式(信任所有证书)
  8. Android缓存处理和清除数据、清除缓存、一键清理的区别
  9. android bitmap的缓存策略

随机推荐

  1. Android中有关Handler的使用(二)
  2. Android(安卓)SDK下载和更新失败的解决方
  3. Android中实现控件圆角边框
  4. Android(安卓)TextView跑马灯效果代码
  5. android grantRuntimePermission 详解
  6. Android下调用收发短信邮件等
  7. 圆形button
  8. Android自定义对话框(Dialog)位置,大小
  9. Android查询短信数据库 查询联系人数据库
  10. PopupWindow 动画显示与消失(逐惭缩放、逐