我正在使用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
(该流来自一个应用程序,该应用程序使用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
和Webm标头(以前存储在服务器上,具有与源流相同的分辨率和帧速率,并在VLC上进行测试)会立即附加。然后webapp开始接收FFMPEG流传输的数据。以下是Mkvinfo GUI的屏幕截图,显示了标题的字段:
但是,即使Chrome控制台的“网络”标签显示存在实际的数据流(意味着流式传输的内容不完全是垃圾,否则连接将被丢弃),播放器也不会显示任何内容。我们尝试手动将我们的标头添加到webapp收到的转储视频中,而VLC播放它很好,但标签不会发生这种情况。
什么可能导致这个问题?我们是否遗漏了FFMPEG方面的编码或者我们在标题上存储了错误的值(或者它们还不够)?
PS:我不能依赖外部流服务器。
PPS:我们尝试了以下实验:
答案 0 :(得分:1)
在考虑使用节点之外(并未集成到节点)中的技术来流式传输视频时,会出现这么多变量。这可能会导致您正在使用的负载均衡器或代理问题,或者可能是您在同一端口上托管2个应用程序。
你可以在节点中进行流媒体传输吗?或者您甚至可以将ffmpeg流式传输到文件系统并使用node.fs.readStream()进行流式传输?这将重用相同的Web服务器,而不是在同一个盒子上生成一个全新的服务器。如果您只是从点到点传输内容,那么您需要缓冲通过的数据并将缓冲区作为流通过节点转发。
技术集成,包装和扩展到其他框架的原因是出于统一的原因。阅读你的问题虽然详细,但它仍然留下了很多超然。这可能会引发对ffmpeg如何转换和提供http内容以及loadbalancer / proxy如何处理它的问题。节点是否与此有关?是否有ffmpeg的替代品,以便您可以围绕节点的框架进行标准化?节点是否适用于此应用程序?