我正在尝试使用媒体源扩展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(按块)将其发送到将客户端提供给媒体源API的JavaScript客户端。
但是,对于直播内容来说,这不是一个好方法。
我现在要做的是创建一个管道,以便实时并尽可能减少延迟。
使用FFmpeg,可以将输出重定向到stdout
而不是out.mp4
并获取内容。
我无法弄清楚是否可以将MP4Box组合到管道中。
stdout
),并且它可以逐步这样做,以便每当输出数据准备好时,我将能够接受它并将其转移到Web客户端,基本上生成一个永无止境的虚线MP4。答案 0 :(得分:10)
您不需要 MP4Box 来生成所需的输出,但您需要自己在内容中查找生成的文件中的框。
基本上,您将使用fMP4
生成H264
,并向浏览器发送初始化moov
框以及您的每个MP4片段的moof+mdat
框生成。你必须用JavaScript编写播放器代码,你可能无法使用标准的DASH播放器。
要生成正确的碎片MP4,您需要将其传递给ffmpeg:-movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof
。
请务必使用最新版本。
答案 1 :(得分:1)
据我了解您的解决方案,您不是在流式传输而是逐步下载单个MP4文件。我理解正确吗?
我最近启动了RTP2DASH项目,从RTP数据源进行真正的DASH直播。它仍然非常“阿尔法”。但它应该很容易用于简单的用例。