【问题标题】:How to use ffmpeg for streaming mp4 via websocket如何使用 ffmpeg 通过 websocket 流式传输 mp4
【发布时间】:2015-10-28 08:15:33
【问题描述】:

我在 nodejs 中编写了一个示例,它通过 mp4 格式的 websocket 连接将一些输入流式传输到客户端。在客户端,将 mp4 包添加到 MediaSourceBuffer。

这运行良好,但前提是客户端从第一个包的开头获取流。所以另一个客户端不能播放当前的Stream,因为他不会从一开始就得到Stream。

我尝试 (try&error) 保存 ffmpeg 发送的第一个包并在新连接开始时发送它,然后是当前流。然后 MediaSourceBuffer 由于编码错误而中断..

这里是 ffmpeg 命令:

-i someInput -g 59 
-vcodec libx264 -profile:v baseline 
-f mp4 -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof
-reset_timestamps 1
-

“empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof”部分应该使 Streampackages 独立于将 moovatom 放在每个部分的开头并按关键帧将各部分调整为 59 帧,所以我不明白为什么我可以'不查看开始后开始的流。

【问题讨论】:

    标签: websocket ffmpeg video-streaming libx264 media-source


    【解决方案1】:

    该命令的输出本身不是“流”。它是一系列连接的片段。必须完整接收每个片段。如果接收到部分片段,它将使解析器感到困惑,以至于无法识别下一个片段的开始。此外,第一个片段输出称为初始化片段。这个初始化片段必须首先发送给客户端。之后可以播放任何片段。因此它必须被服务器缓存。

    【讨论】:

    • 我尝试发送 ffmpeg 提供的第一个包,但没有成功。我 chached 第一个发送的包并在新的客户端连接上,我将 chached 包发送到新的套接字。发送第一个包后,我开始发送当前流。 - 我如何缓存“初始包”?
    • “初始包”到底是什么意思? “初始化片段”可能由ftypmoov 框组成。但可能还有其他人。
    • 我的意思是 ffmpeg code ffmpeg.stdout.on("data",function(data) { if(initialPackage == null){ initialPackage = data 的 child_process.spawn 调用给出的第一个输出; } console.log("发送到 "+clients.length); clients.forEach(function(client) { client.send(data, {binary: true, mask: false}); }); });跨度>
    • 和初始包我的意思是初始化片段;)
    • 正如@szatmary 所说,您需要做一些研究。制作一个mp4 解析器相对容易,如果你想使用MSE,你需要做一些事情。您可以从查看xhelmboyx.tripod.com/formats/mp4-layout.txt 开始,您可以在其中找到所需盒子的描述。您还可以搜索 ISO BMFF,它是定义 mp4 文件内容的标准。
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 2012-10-26
    • 2014-07-23
    • 2023-02-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多