问题 使用mp4box直播短划线内容


我想要直播 H.264 内容到 HTML5 使用媒体源扩展API。

以下方法非常有效:

ffmpeg -i rtsp://10.50.1.29/media/video1 -vcodec copy -f mp4 -reset_timestamps 1 -movflags frag_keyframe+empty_moov -loglevel quiet out.mp4

接着: mp4box -dash 1000 -frag 1000 -frag-rap out.mp4

我可以接受 MP4Box 输出(out_dashinit.mp4并通过Web Sockets将其发送到一个JavaScript客户端,该客户端将其提供给媒体源API。

但是,这不是一个很好的实时内容方法。

我现在要做的是创建一个单独的管道,以便以最小的可能延迟实时完成。 使用FFmpeg可以将输出重定向到 stdout 代替 out.mp4 并抓住内容。 我无法弄清楚是否可以将MP4Box组合到管道中。

  1. MP4Box可以从非文件源获取输入数据吗?
  2. MP4Box可以在实时到达时逐步(从文件或其他来源)获取此类内容吗?如果流停止1秒钟,请稍等一会儿,然后自动恢复。
  3. 同样的问题,但对于输出:它可以输出到不是文件的东西(例如 stdout并且它可以逐步这样做,以便每当输出数据准备就绪时,我将能够将其转移到Web客户端,从而生成一个永无止境的虚线MP4。

4802
2018-06-03 10:35


起源



答案:


你不需要 MP4Box 生成所需的输出,但您需要自己查找内容以查找生成的文件中的框。

基本上你会生成一个 fMP4 同 H264,并发送到浏览器 moov 初始化框和 moof+mdat 您生成的每个MP4片段的框。你必须用JavaScript编写播放器代码,你可能无法使用标准的DASH播放器。

要生成正确的碎片MP4,您需要将其传递给ffmpeg: -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof

请务必使用最新版本。


10
2018-06-04 12:19



您必须使用x264可用的参数。我要检查的第一个是 -tune zerolatency,从那里开始工作。 - Pablo Montilla
@Silvia正如Pablo建议的那样,我不再使用MP4box了,因为我用ffmpeg设置了所有内容。我仍然在努力解决延迟问题,但除此之外,它运行良好。 ffmpeg命令是:“ffmpeg -i rtsp://172.20.28.52:554 / h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov + default_base_moof + frag_keyframe -loglevel quiet - ”我抓住了ffmpeg输出通过stdout并使用Web套接字将其流式传输到Web - galbarm
@gelbarm当你通过websocket发送帧时,你需要以任何方式分割帧(例如,每帧只有一个MP4片段)吗?或者任何数量的字节都可以工作,因为视频/ MediaSource正确地重建了片段?我试图做同样的事情,但它只有10%的时间。 - Philippe Cayouette
@PhilippeCayouette你需要在片段级别进行。基本上你可以在框边界解析编码字节流并发送一个 moof+mdat 框。一旦你正确地初始化它,可以由媒体源对象解析(使用 moov 框)。 - Pablo Montilla
@PabloMontilla你能分享一种方法来分割moov / moof + dat片段中的流,将它们正确地发送给客户端吗? - Jamby


答案:


你不需要 MP4Box 生成所需的输出,但您需要自己查找内容以查找生成的文件中的框。

基本上你会生成一个 fMP4 同 H264,并发送到浏览器 moov 初始化框和 moof+mdat 您生成的每个MP4片段的框。你必须用JavaScript编写播放器代码,你可能无法使用标准的DASH播放器。

要生成正确的碎片MP4,您需要将其传递给ffmpeg: -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof

请务必使用最新版本。


10
2018-06-04 12:19



您必须使用x264可用的参数。我要检查的第一个是 -tune zerolatency,从那里开始工作。 - Pablo Montilla
@Silvia正如Pablo建议的那样,我不再使用MP4box了,因为我用ffmpeg设置了所有内容。我仍然在努力解决延迟问题,但除此之外,它运行良好。 ffmpeg命令是:“ffmpeg -i rtsp://172.20.28.52:554 / h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov + default_base_moof + frag_keyframe -loglevel quiet - ”我抓住了ffmpeg输出通过stdout并使用Web套接字将其流式传输到Web - galbarm
@gelbarm当你通过websocket发送帧时,你需要以任何方式分割帧(例如,每帧只有一个MP4片段)吗?或者任何数量的字节都可以工作,因为视频/ MediaSource正确地重建了片段?我试图做同样的事情,但它只有10%的时间。 - Philippe Cayouette
@PhilippeCayouette你需要在片段级别进行。基本上你可以在框边界解析编码字节流并发送一个 moof+mdat 框。一旦你正确地初始化它,可以由媒体源对象解析(使用 moov 框)。 - Pablo Montilla
@PabloMontilla你能分享一种方法来分割moov / moof + dat片段中的流,将它们正确地发送给客户端吗? - Jamby


据我了解您的解决方案,您不是流式传输,而是逐步下载单个MP4文件。我理解正确吗?

我最近开始了 RTP2DASH 项目从RTP数据源做真正的DASH直播。它仍然非常'alpha',但它应该很容易用于简单的用例。


1
2017-09-11 10:59



不,我的解决方案确实是视频流。虽然数据的内容是碎片化的mp4格式,但数据永远不会写入文件。 - galbarm
我明白了,但它仍然没有DASH,对吗?没有清单,没有多重品质。它正在将RTSP流转换为渐进式下载。 - Sebastian Annies
正确。它不是自适应流媒体解决方案。这是一种尽可能低的延迟 - 单一质量的解决方案。 - galbarm
其中一个好处是这种解决方案不需要转码。它很轻。您可以从单个服务器中流式传输数百个流。 - galbarm
我的提案也不需要转码,但你得到一个DASH流。我觉得使用DASH是一种要求 - 当然如果你使用HTML5视频标签进行渐进式下载,它就会变得轻巧。我见过了 mistserver.org 在IBC的人。他们去年的展示完全是你从覆盆子pi流向几百个客户的方式。也许值得一瞧! - Sebastian Annies