将编码的FFMPEG转换为MPEG-DASH - 或使用关键帧簇进行WebM转换 - 以供MediaSource API使用

22

我目前正在使用MediaSource API发送视频流到Chrome进行播放。

据我所知,MediaSource仅支持使用MPEG-DASH编码的MP4文件或以关键帧开始的WebM文件(否则会出现错误:媒体段没有以关键帧开头)。

有没有办法使用FFMPEG以实时方式编码为MPEG-DASH或关键帧WebM格式?

编辑:

我刚刚尝试了 ffmpeg ... -f webm -vcodec vp8 -g 1,这样每一帧都是一个关键帧。虽然不是理想的解决方案,但现在可以使用MediaStream了。有没有办法将WebM中的片段与关键帧同步,从而不需要每一帧都是关键帧?


关于WebM / MP4和MediaSource的参考问题:

自定义WebM文件在Chrome版本23.0.1271.97 m中无法使用Media Source Api

MediaSource API和mp4

4个回答

11

目前FFMPEG不支持DASH编码。你可以使用FFMPEG(https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment)进行分段,但我建议结合使用FFMPEG和MP4Box。使用FFMPEG转码您的直播视频,然后使用MP4Box进行分段和创建.mpd索引文件。

MP4Box是GPAC的一部分(http://gpac.wp.mines-telecom.fr/)。

以下是使用h264的示例:

ffmpeg -threads 4 -f v4l2 -i  /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720  -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie"

如果你需要使用VP8(WebM),请使用:-vcodec libvpx-f webm-f ts


2
谢谢Cibráne。MP4Box能编码实时管道吗?我们要进行低延迟的直播流。如有进一步的建议,将不胜感激!或者是否有一种方法可以直接从FFMPEG流WebM,并在每个群集处添加关键帧? - Chris Nolet
是的,您可以使用MP4Box对实时视频进行分段。这里的想法是:http://www.slideshare.net/cconcolato/live-streaming-of-video-and-subtitles-with-mpegdash 对于分段器来说,分段VP8或H264的工作是相同的。 - Cibrán Docampo
2
这还是最新的吗?看起来现在至少有一些有限的DASH支持了。https://www.ffmpeg.org/ffmpeg-formats.html#webm_005fdash_005fmanifest - Brad

10

我认为这个(原始的)回答可能仍然对一些进行超低延迟实时流媒体的人非常有用,所以我现在会将其保留在这里。如果您认为这个答案无效,请告诉我,我会删除它。(或者,如果您有更好的零延迟流媒体解决方案,请发表!) - Chris Nolet

8
为确保WebM中的每个群组都以关键帧开始,请尝试以下操作:

ffmpeg \
  [...inputs] \
  -vcodec libvpx \
  -keyint_min 60 \
  -g 60 \
  -vb 4000k \
  -f webm \
  -cluster_size_limit 10M \
  -cluster_time_limit 2100 \
  [...output]

基本上,实现时每个关键帧都必须位于一个簇的开头,但反之不成立。也就是说,一个关键帧会有一个新簇,但一个新簇不一定会有一个关键帧。为了解决这个问题,我们只需将簇大小设置为一个很大的值,以便我们永远不会达到它。
在这个例子中,我们每2秒钟有一个关键帧,簇时间限制为2.1秒,所以我们永远不会达到它。比特率为4Mbit,簇大小限制为10M-某事物。不确定那是比特还是字节,但并不重要,因为我已经将它设置得比需要的大得多。

3
这非常有帮助,现在应该被接受为答案。 - Coderer
我同意!而且,Brad 对这方面的东西了解得太多了 :) - Chris Nolet
我一直遇到这个错误:“错误:ffmpeg以代码1退出:pipe:0:文件结束” - undefined

4
我在尝试使用MediaRecorder API录制的.webm文件通过Media Source Extensions(MSE)播放时,遇到了相同的情况。Chrome(51)的记录是畸形的,Firefox(46)似乎没问题。要使其正常工作,您需要修复.webm文件中的提示:

  1. 克隆https://github.com/webmproject/libwebm
  2. 确保您有cmake版本>= 3.2 (https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. 将fixed.webm加载到DASH /您自己的播放器中!

希望对某人有所帮助。没有DASH关键字很难通过谷歌获得任何信息(我没有使用DASH,只是相同的基础技术 - MSE) :)


您也可以使用Visual Studio在Windows下编译libwebm。它的效果非常好。 - lukyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接