HTML5 的 FFMPEG H.264 编码(以及最终的 MPEG-DASH)

FFMPEG H.264 encoding for HTML5 (and ultimately MPEG-DASH)

我想将 MP4 文件转换为能够通过 Chrome 上的 DASH-IF HTML5 player 播放的 MPEG-DASH 视频。我使用 FFMPEG 和 MP4Box(来自 GPAC)对视频进行转码然后拆分,并在 JavaScript 控制台上不断收到 MEDIA_ERR_SRC_NOT_SUPPORTED 错误。

从在线可用的(非常稀疏的)信息来看(参见 this Chromium thread),看起来 Chrome 本身只支持具有约束基线编码配置文件的 MP4 文件,并且对仅支持 "avc1.42E01E,mp4a.40.2" 编解码器。

在使用 MP4Box 分割之前,我已经尝试了几乎所有可以从命令行编码视频的方法,使用 FFMPEG 获得具有编解码器配置文件 "avc1.42E01E" 的 H.264 视频编码,但它只是一直给我 "avc1.42C01E"。这是我尝试过的(许多)FFMPEG 命令之一:

ffmpeg -y -i Sintel_-_Third_Open_Movie_by_Blender_Foundation.mp4 -profile:v baseline -level:v 30 -acodec libvo_aacenc -vcodec libx264 sintel-recoded.mp4

根据 ITU-T 标准,第 7.4.2.1.1 节和 A2.1-A2.3 节,"avc1.42E01E" 的视频编码意味着约束标志为 0xE0(constraint_set 标志 0 , 1 和 2 已设置),而 "avc1.42C01E" 表示约束标志为 0xC0(constraint_set 标志 0 和 1 已设置)。前者 (0xE0) 表示符合 Baseline、Main 和 Extended 配置文件,而后者 (0xC0) 表示仅符合 Baseline 和 Main 配置文件。

显然,FFMPEG 不支持 H.264 的扩展配置文件。

有人可能对如何将 MP4 文件编码为 "avc1.42E01E" 有任何建议吗?最好使用 FFMPEG,但我愿意使用其他编码器吗?

如果你不是被迫使用 ffmpeg,我建议你试试 x264,就像来自 dash-player.com described in one of their blog posts 的人一样。根据我的经验,我可以肯定地说,Chrome 支持不止一种视频配置文件。

在网上搜索了很长时间,并在 GitHub 等几个地方提问后,我发现部分问题是我没有 事先将音频和视频分开使用 MP4Box:

进行分割
# transcode the video to "avc1.42c00d,mp4a.40.2"
ffmpeg -i Sintel_-_Third_Open_Movie_by_Blender_Foundation.mp4 -c:v libx264 -c:a libvo_aacenc -profile:v baseline -level:v 13 -g 250 -r 25 -keyint_min 250 -strict experimental -b:a 96k sintel.mp4

# copy out the video only
ffmpeg -i sintel.mp4 -c:v copy -an sintel-video.mp4

# copy out the audio only
ffmpeg -i sintel.mp4 -c:a copy -vn sintel-audio.mp4

# create the MPD manifest with MP4Box, but only with onDemand profile
MP4Box -dash 10000 -profile dashavc264:onDemand -out sintel.mpd sintel-audio.mp4 sintel-video.mp4

在 Chrome 40.x 中与 dash.js 玩家一起玩得很好。问题是,它不适用于 live MP4Box 配置文件(每个片段都有单独的 M4S 文件),但这至少是一个开始。

编辑:从那以后,我在使用 castLabs DASH.encrypt utility. See the wiki entries 准备和分割我的内容方面取得了更大的成功,以获取有关如何使用该实用程序的详细信息.不幸的是,我的内容仍然无法通过 MP4Box 进行 DASH。