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

Tha*_*son 3 html video google-chrome ffmpeg chromium

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

从在线提供的(非常稀疏的)信息(请参阅此 Chromium 线程)来看,似乎 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
Run Code Online (Sandbox Code Playgroud)

根据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,但我愿意使用其他编码器?

Tha*_*son 5

在网上找了好久,在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
Run Code Online (Sandbox Code Playgroud)

使用 dash.js 播放器在 Chrome 40.x 中播放得很好。问题是,它不适用于liveMP4Box 配置文件(每个段都有单独的 M4S 文件),但这至少是一个开始。

编辑:从那以后,我在使用 castLabs 的DASH.encrypt 实用程序准备和分割我的内容方面取得了更大的成功。有关如何使用该实用程序的详细信息,请参阅wiki 条目。不幸的是,仍然没有设法让我的内容用 MP4Box 进行 DASH 处理。