【转】Android下录制的mp4视频以http流媒体的形式播放不了
mp4基本知识:
mp4的文件结构中主要包含moov 部分是视频的元数据信息和mdat部分是视频的内容信息
在http协议播放MP4的时候,需要moov这个atom,否则报错退出,但是在以文件形式播放的时候没有这项判断。 实际情况是播放mp4的时候必须首先获得moov的数据,否则没法解析mdat中的audio/video数据 对于http协议播放MP4的情况,是因为moov在mdat后面,也就是在文件末尾,要播放这个文件意味要先把mdat下载下来才能下载到moov,也就是说没法直接获得moov,所以不能通过http的方式在线播放这个文件 并不是以本地文件的形式就不判断moov了,而是文件形式下moov无论在文件头还是文件尾部播放器都可以instant获得moov的数据,而http的方式下不能随意的seek到文件尾部,所以也就无法立即获得moov数据,当然无法播放了 .
关于拖动播放的问题:拖动播放首先就是要找到位置,也就是seek position.seek是定位时间,但时间定位在可以拖动的flv或者mp4文件中都在MetaData事件中传递了keyframes 给播放器,这个keyframes 就是时间和文件数据头定位的对应关系依据。下载数据已经缓冲数据的范围是开始位置off1 和下载缓冲数据量 buffer来确定, 即范围在 [off1,off1+butt]是已经缓冲的数据。还要注意的是这个定位精度是有限制的,最多到1秒精度。
查看mp4文件结构信息的工具,见附件
如果要将mp4文件的末尾的moov atom信息放在文件的起始位置,可以使用qt-faststart 见附件
用法:qt-faststart 源文件 转换后的新文件
这样转换后的mp4文件的就能支持http下的流媒体形式的播放了