如何使用ffmpeg通过websocket传输mp4

如何使用ffmpeg通过websocket传输mp4,websocket,ffmpeg,video-streaming,libx264,media-source,Websocket,Ffmpeg,Video Streaming,Libx264,Media Source,我在nodejs中编写了一个示例,它以mp4格式通过websocket连接将一些输入流式传输到客户端。在客户端,mp4包被添加到MediaSourceBuffer中 这可以正常运行,但前提是客户机从第一个包开始就获得流。因此,另一个客户端无法播放当前流,因为他无法从一开始就获得流 我尝试(try&error)保存ffmpeg发送的第一个包,并在新连接开始时发送,然后是当前流。然后,MediaSourceBuffer由于编码错误而中断 以下是ffmpeg命令: -i someInput -g 59

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

这可以正常运行,但前提是客户机从第一个包开始就获得流。因此,另一个客户端无法播放当前流,因为他无法从一开始就获得流

我尝试(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帧中调整零件大小,因此,我不明白为什么我不能查看启动后开始的流。

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

我试图发送ffmpeg提供的第一个包,但没有成功。我更改了第一个发送的包,在新的客户端连接上,我将更改后的包发送到新的套接字。发送第一个包后,我开始发送当前流如何缓存“初始包”?您所说的“初始包”到底是什么意思?“初始化片段”可能由
ftyp
moov
框组成。但是可能还有其他的。我指的是ffmpeg
code
ffmpeg.stdout.on(“data”,function(data){if(initialPackage==null){initialPackage=data;}console.log(“发送到”+clients.length);clients.forEach(function(client){client.send(data,{binary:true,mask:false}; }); });对于初始包,我指的是初始化片段;)正如@szatmary所说,您需要做一些研究。制作
mp4
解析器相对容易,如果您想使用MSE,您需要做一些事情。你可以从哪里找到你需要的盒子的描述开始。您还可以在谷歌上搜索ISO BMFF,这是定义
mp4
文件内容的标准。