当前位置: 首页 > 知识库问答 >
问题:

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

阮桐
2023-03-14

我想把一个MP4文件转换成一个MPEG-DASH视频,可以通过Chrome上的Dash-if HTML5播放器播放。我使用FFMPEG和MP4Box(来自GPAC)对视频进行转码,然后对其进行拆分,并在JavaScript控制台上不断得到一个MEDIA_ERR_SRC_NOT_SUPPORTED错误。

从网上提供的(非常稀疏的)信息(请参见此Chromium线程)来看,Chrome似乎只支持带有约束基线编码配置文件的MP4文件,并且非常严格地只支持“AVC1.42E01E,MP4A.40.2”编解码器。

在使用MP4Box和FFMPEG拆分之前,我已经尝试了几乎所有的方法来从命令行对视频进行编码,以获得一个带有编解码器配置文件“AVC1.42C01E”的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)意味着与基线、主概要文件和扩展概要文件的一致性,而后者(0xC0)意味着只与基线和主概要文件的一致性。

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

是否有人对如何将MP4文件编码为“AVC1.42E01E”有任何建议?理想情况下使用FFMPEG,但我对使用其他编码器持开放态度?

共有1个答案

武嘉祥
2023-03-14

在网上搜索了很长时间,并在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

在Chrome40.x和dash.js播放器中玩得很好。麻烦的是,它不适用于liveMP4Box配置文件(每个段都有单独的M4S文件),但它至少是一个开始。

编辑:从那以后,我在使用CastLabs的dash.encrypt实用工具准备和分割内容方面取得了更大的成功。有关如何使用该实用工具的详细信息,请参阅wiki条目。不幸的是,我仍然没有设法让我的内容与MP4Box短跑。

 类似资料:
  • 我想用不同的比特率和分辨率对MPEG-DASH的实时流进行编码,以便实时播放。 到目前为止,我发现的一切要么只使用源分辨率(灵活,nginx rtmp模块),要么似乎只用于VOD流媒体(DASHEncoder)。 是否可以将DASHEncoder与实时输入(rtmp流)一起使用,我将如何做到这一点?如果没有,是否可以将nginx-rtmp ffmpeg用于我想做的事情?

  • 我需要验证视频文件是(在Java): 视频是H.264编码的 我调查过JMF和Xuggle。 Xuggle使加载和解码文件变得更容易,并将其转换为另一种格式,但我还不知道如何确定我加载的文件的编码。 所以我想知道Xuggle是否有能力简单地返回视频类型 如果我需要自己确定,有人能给我指一些H.264格式的文档吗

  • 我已从安装ffmpeg 3.0https://github.com/FFmpeg/FFmpeg,我正在尝试将用mepeg4第2部分编码的视频转换为H264,但我得到未知编码器“libx264”错误 我试过h264, x264, libx264,都不管用) 我查看了支持的编解码器列表 这里是h264: 我使用的是ffmpeg 3.0,从列表中可以看出,似乎不支持h264编码,只支持h264解码,对吗

  • 我目前正在发送一个视频流到Chrome,通过MediaSource API播放。 有什么方法可以实时地用FFMPEG编码成MPEG-DASH或关键帧WebM格式吗? 编辑: 我只是用尝试了一下,这样每个帧都是一个关键帧。不是理想的解决方案。不过,它现在确实适用于纵隔。在WebM中,有什么方法可以将段与关键帧同步,这样就不需要每个帧都是关键帧了? MediaSource API和mp4

  • 配置选项 要做到最大限度的定制每一个软件包,获取完整的配置选项是必须的。当然,要想更加详细、全面的了解如何自定义安装,还需要查看 README INSTALL FAQ 之类的文档,甚至是软件包的官方手册。需要注意的是,有不少软件包的配置选项分布在多个 configure 脚本中,还有少数并不是通过 configure 脚本进行配置的,查看完整的配置信息就变成一件很吃力的事情了。因此唯一的建议就是:

  • 我们有一个应用程序,它使用ffmpeg C API对mp4容器中的mpeg-4(AV_CODEC_ID_MPEG4)文件进行编码。问题是这些文件不能在Windows Media Player或Windows 10视频播放器“电影和电视”应用程序中播放。它在VLC、谷歌chrome、Ubuntu的视频播放器和我试过的所有其他视频播放器中播放。 这两个Windows播放器可以播放mp4容器中用mpeg