Node.js Webm直播服务器:<video>标签</video>的问题

时间:2013-12-06 15:14:17

标签: html5 node.js ffmpeg 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

(该流来自一个应用程序,该应用程序使用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的屏幕截图,显示了标题的字段:

Header screenshot

但是,即使Chrome控制台的“网络”标签显示存在实际的数据流(意味着流式传输的内容不完全是垃圾,否则连接将被丢弃),播放器也不会显示任何内容。我们尝试手动将我们的标头添加到webapp收到的转储视频中,而VLC播放它很好,但标签不会发生这种情况。

什么可能导致这个问题?我们是否遗漏了FFMPEG方面的编码或者我们在标题上存储了错误的值(或者它们还不够)?

PS:我不能依赖外部流服务器。

PPS:我们尝试了以下实验:

  • 将视频标头替换为存储在服务器中的视频标头,使视频可在vlc和视频标签上播放
  • 如果我们转储已经启动的视频(没有标题)并且我们预先存储在服务器中的视频标头或者甚至是其原始标题,则视频可以在VLC中播放但不在标签上播放(我们正在仔细预先添加)就在集群开始之前的标题。)

1 个答案:

答案 0 :(得分:1)

在考虑使用节点之外(并未集成到节点)中的技术来流式传输视频时,会出现这么多变量。这可能会导致您正在使用的负载均衡器或代理问题,或者可能是您在同一端口上托管2个应用程序。

你可以在节点中进行流媒体传输吗?或者您甚至可以将ffmpeg流式传输到文件系统并使用node.fs.readStream()进行流式传输?这将重用相同的Web服务器,而不是在同一个盒子上生成一个全新的服务器。如果您只是从点到点传输内容,那么您需要缓冲通过的数据并将缓冲区作为流通过节点转发。

技术集成,包装和扩展到其他框架的原因是出于统一的原因。阅读你的问题虽然详细,但它仍然留下了很多超然。这可能会引发对ffmpeg如何转换和提供http内容以及loadbalancer / proxy如何处理它的问题。节点是否与此有关?是否有ffmpeg的替代品,以便您可以围绕节点的框架进行标准化?节点是否适用于此应用程序?