Node.js Webm直播stream服务器:与<video>标记的问题

我使用Node.js作为stream服务器来传输FFMPEG发送的实时Webmvideo(从另一个应用程序执行,stream通过HTTP完成),并由使用该标记的Web应用程序接收。

这是我在做什么:FFMPEG使用以下命令stream接收的帧:

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 

(stream来自使用Kinect作为源的应用程序,并通过pipe道与FFMPEG通信,发送一个接一个的帧)

当Web应用程序连接时,它立即从服务器接收到这个响应:

 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标题(以前存储在服务器上,具有相同的源stream的分辨率和帧速率,并在VLC上进行testing)被立即追加。 然后webapp开始接收由FFMPEGstream传输的数据。 这是Mkvinfo GUI的屏幕截图,显示标题的字段:

标题截图

但是,即使Chrome控制台的“networking”标签显示存在实际的数据stream(即stream式传输不完全是垃圾,否则连接将被丢弃),播放器也不会显示任何内容。 我们尝试手动将我们的标题添加到Web应用程序收到的转储的video,VLC播放它就好了,但这不是标签发生的情况。

什么会导致这个问题? 我们是否错过了FFMPEG方面的编码,或者我们在头上存储了错误的值(或者它们不够)?

PS:我不能依靠外部stream服务器。

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

  • 使用存储在服务器中的video标题代替video标题使video可以在vlc和video标签上播放
  • 如果我们转储已经启动的video(没有标题),并且我们预先保存了存储在服务器甚至是原始标题中的video标题,那么video可以在VLC中播放,但不能在标签上播放(我们正在小心地预先标记标题在集群的开始之前)。

当考虑到您正在使用除节点以外的技术(并且未集成到节点)来stream式传输video时,会出现如此多的variables。 这可能会导致您正在使用的负载均衡器或代理的问题,也可能是您在同一个端口上托pipe2个应用程序。

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

为什么技术整合,包装和扩展到其他框架的原因是为了统一。 阅读你的问题,虽然它的详细,但仍然留下很多超然。 这可能会导致ffmpeg如何转换和提供http内容,以及负载平衡器/代理如何处理该内容。 节点与此有什么关系? 是否有替代ffmpeg,所以你可以围绕节点的框架标准化? 节点是否适合这个应用程序?