bre*_*he0 6 html5 ffmpeg node.js html5-video webm
我正在使用Node.js作为流服务器来传输由FFMPEG发送的实时Webm视频(从另一个应用程序执行,流通过HTTP完成)并由使用该标记的webapp接收.
这就是我正在做的事情:FFMPEG使用以下命令流式传输接收到的帧:
ffmpeg -r 30 -f rawvideo -pix_fmt bgra -s 640x480
-i \\.\pipe\STREAM_PIPE -r 60
-f segment -s 240x160 -codec:v libvpx -f webm
http://my.domain.com/video_stream.webm
Run Code Online (Sandbox Code Playgroud)
(该流来自一个应用程序,该应用程序使用Kinect作为源并通过管道与FFMPEG通信,一帧接一个地发送)
当webapp连接时,它立即从服务器接收此响应:
HTTP/1.1 200 OK
X-Powered-By: Express
content-type: video/webm
cache-control: private
connection: close
Date: Fri, 06 Dec 2013 14:36:31 GMT
Run Code Online (Sandbox Code Playgroud)
并且会立即附加Webm标头(先前存储在服务器上,具有与源流相同的分辨率和帧速率,并在VLC上进行测试).然后webapp开始接收FFMPEG流传输的数据.以下是Mkvinfo GUI的屏幕截图,显示了标题的字段:

但是,即使Chrome控制台的"网络"标签显示存在实际的数据流(意味着流式传输的内容不完全是垃圾,否则连接将被丢弃),播放器也不会显示任何内容.我们尝试手动将我们的标头添加到webapp收到的转储视频中,而VLC播放它很好,但标签不会发生这种情况.
什么可能导致这个问题?我们是否遗漏了FFMPEG方面的编码或者我们在标题上存储了错误的值(或者它们还不够)?
PS:我不能依赖外部流服务器.
PPS:我们尝试了以下实验:
当考虑到您正在使用节点之外(而不是集成到节点中)的技术来流式传输视频时,这个问题会添加很多变量。这可能会导致您正在使用的负载平衡器或代理出现问题,或者您可能在同一端口上托管 2 个应用程序。
你能在节点中进行流传输吗?或者您甚至可以将 ffmpeg 流式传输到文件系统并使用 node.fs.readStream() 进行流式传输吗?这将重用相同的网络服务器,而不是在同一个盒子上生成一个全新的服务器。如果您只是将内容从点传输到点,那么您需要缓冲通过的数据,并将缓冲区作为流转发通过节点。
技术之所以被集成、包装并扩展到其他框架中是出于一致性的原因。读了你的问题,虽然很详细,但仍然留下了很多冷漠的地方。这可能会导致有关 ffmpeg 如何转换和提供 http 内容以及负载均衡器/代理如何处理该内容的问题。节点与此有什么关系吗?是否有 ffmpeg 的替代品,以便您可以围绕节点框架进行标准化?Node 适合这个应用程序吗?