加载中…
个人资料
芝麻開花
芝麻開花
  • 博客等级:
  • 博客积分:0
  • 博客访问:198,247
  • 关注人气:29
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

[Android]视频播放之MP4

(2012-07-04 14:34:32)
标签:

android

video

player

it

分类: 手机开发

格式编码

项目的需求要实现流媒体的播放,简言之就是视频可以支持边下载边播放。鉴于MP4/h.264编码的优势,视频采用MP4文件格式存储,因为mp4只是一个存储的规范,像国内的优酷主要采用flv文件格式,其内部也是MP4编码,flv是 Adobe 支持的格式,这样的话,不论是在网站端,通过pc浏览器浏览,借助于Flash Player,还是手持设备,借助于ffmpeg的解码库,都能实现视频的无缝播放,算是一个比较完美的解决方案。

在实际视频的处理中,发现一个问题,利用Android手机自己拍摄录制的视频,可以完美支持边下载边播放,通过Iphone手机录制的视频,然后转码成mp4格式的视频就不能支持边下载边播放了,问题困扰了两三天,没办法,开始研究mp4的存储格式,最后终于找到了问题的所在。

了解mp4格式的应该知道,mp4是采用一种box数据结构来存储视频数据的,理想的情况是,box的顺序为ftyp,moov,free和mdat,通过moov的解析就能获取该视频的关键信息,比如播放时长,关键帧数,sample存储情况,在mdat中对应的编码数据偏移量等等。这样只要视频缓存完头部信息,即moov之后,就能知道当前视频的关键数据了,随着mdat的逐渐下载,就能完美实现视频的边缓存边播放,具体的实例教程请参见我的博文《Android视频播放之边缓存边播放》

如何查看MP4文件的格式呢?

有一个解析包,mp4parser.Google的项目地址为 http://code.google.com/p/mp4parser/,它主要实现了mp4和其他格式媒体数据的解析。下载地址为 http://code.google.com/p/mp4parser/downloads/detail?name=isoviewer-2.0-RC-10.jar ,可以通过它来查看视频文件的整体编码结构。

下载这个jar文件后,打开命令行,输入下面命令:

c:\soft>java -jar isoviewer-2.0-RC-10.jar

如图所示:

[Android]视频播放之MP4
弹出对话框如下:

[Android]视频播放之MP4
选择File-->Open,随便选择一个MP4文件。

[Android]视频播放之MP4
从上图就可以看到这个MP4的结构。

当然,不是所有的MP4的结构都是一样的。如果都是一样的,这个软件也没啥意义了。试着打开另外一个文件,如下:

[Android]视频播放之MP4
由上面两张图可以看到,有的就把moov放置到mdat之后了,这样只有把视频全部下载完成之后才能获取该视频的关键信息,才能开始播放,理论上也就没法实现视频的边缓存边播放,找到问题的关键点之后,就开始寻找解决办法,终于找到qt-faststart,它能解析原视频格式,并将moov信息尽可能的提前,这样就能及早解析和播放视频了。

格式转换

下载地址:

我使用的是window的客户端,使用命令如下: 


Usage: qt-faststart (转换前的视频文件) (转换后的视频文件)

[Android]视频播放之MP4
不过因为这个MP4文件比较怪,所以转换不了。呵呵。

[Android]视频播放之MP4

参考文章

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有