最近在Flash上实现MP4文件点播时,发现部分MP4文件在原有的播放器上无法播放,经过定位发现,原来是MP4 BOX搞的鬼!
什么是MP4 BOX?
对于一般的MP4文件,BOX顺序为:ftyp-moov-free-mdat.
而对于部分经过视频软件处理后的MP4文件,BOX顺序发生了改变:ftyp-free-mdat-moov.
对于这种顺序的MP4文件,在完整下载文件之前,无法获取moov信息,因此是无法实现边下载边播放的。
解决方案
对源文件进行重新编码
既然BOX顺序有问题,可以从源头上进行处理:调整BOX顺序。工具qt-faststart即是实现该功能的利器。
qt-faststart主页下载了qt-faststart.exe binary for Windows之后,通过cmd对def.mp4文件进行转化: qt-faststart.exe def.mp4 def_new.mp4
转化后,box顺序果然发生了变化,播放正常。
使用AtomicParsley对MP4文件进行解析:
Atom ftyp @ 0 of size: 32, ends @ 32
Atom free @ 32 of size: 8, ends @ 40
Atom mdat @ 40 of size: 1025668, ends @ 1025708
Atom moov @ 1025708 of size: 13925, ends @ 1039633
Atom mvhd @ 1025716 of size: 108, ends @ 1025824
Atom trak @ 1025824 of size: 6608, ends @ 1032432
Atom tkhd @ 1025832 of size: 92, ends @ 1025924
Atom edts @ 1025924 of size: 36, ends @ 1025960
Atom elst @ 1025932 of size: 28, ends @ 1025960
Atom mdia @ 1025960 of size: 6472, ends @ 1032432
Atom mdhd @ 1025968 of size: 32, ends @ 1026000
Atom hdlr @ 1026000 of size: 45, ends @ 1026045
Atom minf @ 1026045 of size: 6387, ends @ 1032432
Atom vmhd @ 1026053 of size: 20, ends @ 1026073
Atom dinf @ 1026073 of size: 36, ends @ 1026109
Atom dref @ 1026081 of size: 28, ends @ 1026109
Atom stbl @ 1026109 of size: 6323, ends @ 1032432
Atom stsd @ 1026117 of size: 167, ends @ 1026284
Atom avc1 @ 1026133 of size: 151, ends @ 1026284
Atom avcC @ 1026219 of size: 49, ends