http协议的MP4文件播放问题的分析

现在手上有两个链接 
(1) http://202.108.16.173/cctv/video/8C/35/EB/E8/8C35EBE84E7B483C8741CF9A60154993/gphone/480_320/200/0.mp4 
(2) http://202.108.16.173/cctv/video/8C/35/EB/E8/8C35EBE84E7B483C8741CF9A60154993/iphone/480_320/200/0.mp4 
现在的情况是这样的: 

lusure 2009-12-30 16:57

1.(1)在android中可以播放,(2)不能播放 
2.在android中把视频下载下来,都可以播放。 
3.在pc上用vlc测试两个链接,(1)播放几秒后卡住不动,(2)流畅播放。(ps:网速不是问题) 
把两个文件都下载下来,头部分如下: 
(1)ftypisom   isomiso2avc1mp41  遞moov  lmvhd    |%皜|%皜  ?摢   
(2)ftypisom   isomiso2avc1mp41  free 0⑸mdat?  libfaac 1.28  B ?2 G  
现在想要知道(2)这个链接为什么不能播放。跟踪了android的代码,发现在http协议播放MP4的时候,需要moov这个atom,否则报错退出,但是在以文件形式播放的时候没有这项判断。 
想问下这两个链接的播放方式有什么不同,为什么在android上的播放和在vlc上的播放都出现不同的结果? 

psusong 2009-12-31 10:18

实际情况是播放mp4的时候必须首先获得moov的数据,否则没法解析mdat中的audio/video数据 

对于2的情况,是因为moov在mdat后面,也就是在文件末尾,要播放这个文件意味要先把mdat下载下来才能下载到moov,也就是说没法直接获得moov,所以不能通过http的方式在线播放这个文件 

并不是以文件的形式就不判断moov了,而是文件形式下moov无论在文件头还是文件尾部播放器都可以instant获得moov的数据,而http的方式下不能随意的seek到文件尾部,所以也就无法立即获得moov数据,当然无法播放了 
原文地址:https://www.cnblogs.com/lidabo/p/7279452.html