将FFMPEG编码为MPEG-DASH(或带有关键帧集群的WebM) - 用于MediaSource API

Chr*_*let 18 video html5 ffmpeg h.264 webm

我目前正在向Chrome发送视频流,以通过MediaSource API播放.

据我了解,MediaSource仅支持使用MPEG-DASH编码的MP4文件,或者支持以关键帧开头的集群的WebM文件(否则会引发错误:媒体段不以关键帧开头).

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

编辑:

我只是试了一下,ffmpeg ... -f webm -vcodec vp8 -g 1所以每一帧都是一个关键帧.不是理想的解决方案.它现在可以与MediaStream一起使用.有没有办法将段与WebM中的关键帧同步,所以不是每个帧都需要是一个关键帧?


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

Media Source Api无法用于自定义webm文件(Chrome版本23.0.1271.97 m)

MediaSource API和mp4

小智 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"
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢Cibráne.MP4Box能够编码实时管道吗?我们正在寻找低延迟的直播流.任何进一步的建议将非常感谢!或者有没有办法直接从FFMPEG流式传输WebM并在每个群集中使用关键帧? (2认同)
  • 这仍然是最新的吗?看起来现在至少有一些有限的DASH支持.https://www.ffmpeg.org/ffmpeg-formats.html#webm_005fdash_005fmanifest (2认同)

Chr*_*let 9

另一位用户有一些运气:

ffmpeg ... \
  -f mp4 \
  -reset_timestamps 1 \
  -movflags empty_moov+default_base_moof+frag_keyframe \
  -probesize 200000
Run Code Online (Sandbox Code Playgroud)

请参阅galbarm的问题:

注意:如果输入视频中没有关键帧,则可能需要设置:

-frag_duration 100000
Run Code Online (Sandbox Code Playgroud)

......而不是+frag_keyframe.


Bra*_*rad 5

要确保 WebM 中的每个集群都以关键帧开头,请尝试以下操作:

ffmpeg \
  [...inputs] \
  -vcodec libvpx \
  -keyint_min 60 \
  -g 60 \
  -vb 4000k \
  -f webm \
  -cluster_size_limit 10M \
  -cluster_time_limit 2100 \
  [...output]
Run Code Online (Sandbox Code Playgroud)

基本上,在实施时,每个关键帧都必须位于集群的开头,但反之则不然。也就是说,在关键帧上会有一个新集群,但在新集群上不一定会有关键帧。为了解决这个问题,我们只需将集群大小设置为我们永远不会遇到的大值。

在这个例子中,我们每 2 秒有一个关键帧,集群时间限制是 2.1 秒,所以我们永远不会命中它。比特率为 4Mbit,簇大小限制为 10M 左右。不确定它是位还是字节,但这并不重要,因为我们永远不会击中它,因为我已将其设置得比需要的大得多。

  • 这非常有用,现在应该是公认的答案。 (3认同)