h.264video不会在iOS上播放

我有一个video文件编码与h.264不会在iOS上玩,我想知道为什么。 这是HTML:

<video style="width: 480px; height: 360px;" autoplay controls> <source src="sample.mp4"> </video> 

这个video在桌面浏览器中可以正常播放,但是在iOS设备上,我看到一个不可点击的播放图标。 我读过,这意味着video的编码有问题,但我不确定是什么问题。

我通过MediaInfo运行video:

 General Format : MPEG-4 Format profile : Base Media Codec ID : isom File size : 706 KiB Duration : 15s 256ms Overall bit rate mode : Variable Overall bit rate : 379 Kbps Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : Main@L5.1 Format settings, CABAC : Yes Format settings, ReFrames : 6 frames Codec ID : avc1 Codec ID/Info : Advanced Video Coding Duration : 15s 250ms Bit rate : 311 Kbps Width : 480 pixels Height : 360 pixels Display aspect ratio : 4:3 Frame rate mode : Constant Frame rate : 24.000 fps Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.075 Stream size : 578 KiB (82%) Audio ID : 2 Format : AAC Format/Info : Advanced Audio Codec Format profile : LC Codec ID : 40 Duration : 15s 256ms Bit rate mode : Variable Bit rate : 62.8 Kbps Channel(s) : 2 channels Channel positions : Front: LR Sampling rate : 44.1 KHz Compression mode : Lossy Stream size : 117 KiB (17%) 

另外,我通过GSpot运行它并获得了一些额外的信息:

 Container isom: MP4 Base Media v1 [IS0 14496-12:2003] - mp41: MP4 v1 [ISO 14496-1:ch13] 

谁能告诉我为什么这个video不会播放? 我知道我可以简单地重新编码video,如果我这样做,它在iOS上运行良好。 但我想知道原始文件的问题是什么。

为了进行比较,下面是我编写的重新编码版本(这个工作)的MediaInfo分析:

 General Format : MPEG-4 Format profile : Base Media Codec ID : isom File size : 990 KiB Duration : 15s 256ms Overall bit rate mode : Variable Overall bit rate : 532 Kbps Writing application : Lavf53.19.0 Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : High@L2.1 Format settings, CABAC : Yes Format settings, ReFrames : 4 frames Codec ID : avc1 Codec ID/Info : Advanced Video Coding Duration : 15s 250ms Bit rate : 414 Kbps Width : 480 pixels Height : 360 pixels Display aspect ratio : 4:3 Frame rate mode : Constant Frame rate : 24.000 fps Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.100 Stream size : 771 KiB (78%) Writing library : x264 core 118 r2085 8a62835 Encoding settings : cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x111 / me=hex / subme=6 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=12 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=22.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 Audio ID : 2 Format : AAC Format/Info : Advanced Audio Codec Format profile : LC Codec ID : 40 Duration : 15s 256ms Bit rate mode : Variable Bit rate : 111 Kbps Maximum bit rate : 128 Kbps Channel(s) : 2 channels Channel positions : Front: LR Sampling rate : 44.1 KHz Compression mode : Lossy Stream size : 207 KiB (21%) 

GSpot关于这个容器的信息是不同的(这可能是为什么这个工程?):

 Container isom: MP4 Base Media v1 [IS0 14496-12:2003] - iso2: MP4 Base Media v2 [ISO 14496-12:2005] - avc1: MP4 Base w/ AVC ext [ISO 14496-12:2005] - mp41: MP4 v1 [ISO 14496-1:ch13] 

唯一可以考虑的是参考帧的数量(我读过的最大值是3),但是重新编码的版本有4个,所以我想这可能不是。

find解决我自己的问题:

问题是video使用h.264 Main Profile级别5.1,而iOS只支持AVC级别3.1(更多信息在这里 )。

我通过按照这些说明确认了这一点,使用hex编辑器更改configuration文件和级别字节。 以ASCII格式search文件avcC或以hex格式search61 76 63 43 。 第一个字节通常是01 ,对于这个目的不重要,但是之后应该是下列之一:

 42 E0 – for Baseline Profile 4D 40 – for Main Profile 58 A0 – for Extended Profile 64 00 – for High Profile 

之后的数字是hex的级别(没有小数点),例如:

 1F (31 in dec) is level 3.1 29 (41 in dec) is level 4.1 33 (51 in dec) is level 5.1 

如果你find并replaceconfiguration文件/等级字节的所有实例(例如,search4D 40 33并replace为你想要的字节 – 在我的情况下是4D 40 1F ),那么video现在应该在iOS上播放。 请注意,许多网页帮助页面都表示iOS需要基线configuration文件,但似乎并不正确。 只要AVC级别为3.1,主要工作正常。