简体   繁体   English

h.264 视频无法在 iOS 上播放

[英]h.264 video won't play on iOS

I have a video file encoded with h.264 that will not play on iOS, and I'd like to know why.我有一个无法在 iOS 上播放的 h.264 编码的视频文件,我想知道原因。 Here's the HTML:这是 HTML:

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

This video plays fine in a desktop browser, but on iOS devices I see an un-clickable Play icon with a slash through it.该视频在桌面浏览器中可以正常播放,但在 iOS 设备上,我看到一个不可点击的播放图标,上面有一个斜线。 I've read that this means there's a problem with the video's encoding, but I'm not sure what the problem is.我读到这意味着视频的编码有问题,但我不确定问题是什么。

I ran the video through MediaInfo:我通过 MediaInfo 运行了视频:

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: L R
Sampling rate                            : 44.1 KHz
Compression mode                         : Lossy
Stream size                              : 117 KiB (17%)

Also, I ran it through GSpot and got some additional info:另外,我通过 GSpot 运行它并获得了一些额外的信息:

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

Can anyone tell me why this video won't play?谁能告诉我为什么这个视频不能播放? I know I can simply re-encode the video, and if I do, it plays fine on iOS.我知道我可以简单地重新编码视频,如果我这样做,它在 iOS 上播放得很好。 But I'd like to know what the problem with the original file is.但我想知道原始文件的问题是什么。

For comparison, here's the MediaInfo analysis of a re-encoded version I made (this one works):为了进行比较,这是我制作的重新编码版本的 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: L R
Sampling rate                            : 44.1 KHz
Compression mode                         : Lossy
Stream size                              : 207 KiB (21%)

GSpot's info about this one's container is different (could that be why this one works?): 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]

The only other thing I can think of is the number of reference frames (I've read the max is 3), but the re-encoded version has 4 so I figure that's probably not it.我唯一能想到的另一件事是参考帧的数量(我读过最大为 3),但重新编码的版本有 4 个,所以我认为这可能不是它。

Found the solution to my own question:找到了我自己问题的解决方案:

The problem was that the video used the h.264 Main Profile level 5.1, while iOS only supports AVC level 3.1 (more info here ).问题是视频使用了 h.264 Main Profile level 5.1,而 iOS 仅支持 AVC level 3.1(更多信息请点击此处)。

I confirmed this by following these instructions to change the profile and level bytes using a hex editor.我通过按照这些说明使用十六进制编辑器更改配置文件和级别字节来确认这一点。 Search the file for avcC in ASCII or 61 76 63 43 in hex.在文件中搜索 ASCII 格式的avcC或十六进制格式的61 76 63 43 The first byte is usually 01 and is unimportant to this purpose, but after that should be one of the following:第一个字节通常是01并且对此目的不重要,但之后应该是以下之一:

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

The number after that is the level (without the decimal point) in hex, eg:后面的数字是十六进制的级别(没有小数点),例如:

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

If you do a find and replace of all instances of the profile/level bytes (eg, search 4D 40 33 and replace with the bytes you want--in my case 4D 40 1F ), the video should now play on iOS.如果您查找并替换配置文件/级别字节的所有实例(例如,搜索4D 40 33并替换为您想要的字节——在我的例子中为4D 40 1F ),视频现在应该可以在 iOS 上播放。 Note that many web help pages say iOS requires the Baseline profile, but that doesn't appear to be true.请注意,许多 Web 帮助页面都说 iOS 需要 Baseline 配置文件,但这似乎不是真的。 Main works fine as long as the AVC level is 3.1.只要 AVC 级别为 3.1,Main 就可以正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM