使用mp4box进行实时流媒体DASH内容传输

16

我正在尝试使用媒体源扩展API将H.264内容以HTML5形式直播。

以下方法效果很好:

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。
2个回答

13
您不需要使用MP4Box生成所需的输出,但您需要自己查找生成文件中的盒子并对内容进行分块。
基本上,您将使用H264生成一个fMP4,并向浏览器发送moov盒子进行初始化,并为您生成的每个MP4片段发送moof + mdat盒子。您将需要在JavaScript中编写播放器,可能无法使用标准的DASH播放器。
为了生成正确的分段MP4,请将此传递给ffmpeg:-movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof
请确保使用可用的最新版本。

1
另外,我刚刚了解到有一个用于实时流媒体的破折号配置文件(urn:mpeg:dash:profile:isoff-live:2011),因此您可以调整输出并使用标准播放器进行播放。 - Pablo Montilla
3
根据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 -" 我通过stdout抓取ffmpeg输出并使用websocket将其流式传输到网络。 - galbarm
3
在通过websocket发送帧时,您需要将帧分割成任何特定的方式吗(例如每个帧仅一个MP4片段),还是任何数量的字节都可以,因为视频/MediaSource可以正确重构片段?我正在尝试做完全相同的事情,但只有10%的时间可以正常工作。 - Philippe Cayouette
3
@PhilippeCayouette,您需要在片段级别上进行操作。基本上,您可以在盒子边界解析编码字节的流并发送 moof + mdat 盒子。只要正确初始化了媒体源对象(带有 moov 盒子),就可以通过它进行解析。 - Pablo Montilla
2
@PabloMontilla,你能分享一种将流分割成moov/moof+dat片段的方法,以便正确地发送给客户端吗? - Jamby
显示剩余14条评论

1
据我理解,您的解决方案不是流式传输,而是逐步下载单个MP4文件。我理解得对吗?
最近我开始了RTP2DASH项目,以从RTP数据源进行真正的DASH实时流式传输。它仍处于非常“alpha”阶段,但对于简单的用例应该很容易采用。

1
不,我的解决方案确实是视频流。虽然数据的内容是分段的mp4格式,但数据从未写入文件。 - galbarm
我理解了,但它仍然不是DASH,对吧?没有清单和多个质量。它将RTSP流转换为渐进式下载。 - Sebastian Annies
1
正确。它不是自适应流媒体解决方案。它是一种最低延迟 - 单一质量的解决方案。 - galbarm
其中一个好处是这种解决方案不需要转码,非常轻便。您可以从单个服务器潜在地流式传输数百个流。 - galbarm
我的建议是不需要进行转码,但你可以获得DASH流。我有一种感觉,使用DASH似乎是一种要求 - 当然,如果你使用HTML5视频标签进行渐进式下载,它会非常轻量级。我在IBC上遇到了http://mistserver.org/的团队。他们去年的展示正好是你从树莓派向几百个客户端进行流媒体传输的方式。值得一看! - Sebastian Annies

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