我的智慧结束了。
我想将实时视频直播流式传输到网络浏览器。
目前我使用ffmpeg将一个directshow实时源作为webm流流式传输到node.js,然后将该流转发给来自<video>
元素的http请求。到目前为止一切正常。
直播源 - &gt; ffmpeg - &gt; POST [webm] - &gt; node.js - &gt; GET [webm] - &gt;视频标签
我的问题是源时钟和Web客户端时钟并不完全匹配(不是那么令人惊讶)。对于视频而言,这不是问题,不时地删除或复制帧不明显。然而,对于音频,这是另一个问题。从我迄今为止所能解决的问题来看,Chrome(或任何其他浏览器)不执行任何形式的音频重采样补偿(例如来自ffmpeg的swr_set_compensation
)以补偿这种不匹配。相反,当播放缓冲区用完样本时,我会听到非常可听见的音频失真(响亮的嘟嘟声)。
我的问题是,是否可以在网络浏览器中实现正常播放的正确播放(使用音频)?
我还没有尝试过使用silverlight或flash进行播放。这可能会更好吗?
答案 0 :(得分:4)
流媒体(音频或/和视频)流式传输到网络浏览器已经有几年了,尽管它至今仍在取得进展。对于网络媒体来说,这是下一个重要的事情,像Youtube这样的许多平台已经在网上。
典型的实时媒体流方案是:
音频/视频Feed&gt;转码&gt;流媒体&gt;播放器
在每一步中,您都有多种技术可能性。但是我应该在这里提到,实时媒体流的道路是用专有技术铺平的。
快速进入MPEG DASH并且可以与HTML5视频一起使用。有JS lib支持直播。我已经对它进行了测试,虽然我可能不会将它用于生产案例场景,因为它仍然有点笨重(按需支持更好)并且浏览器支持目前很窄(截至2013年8月30日) ,桌面Chrome,桌面Internet Explorer 11和Android版移动Chrome测试版是唯一支持的浏览器。
我不能对你的解决方案发表太多评论,因为我没有使用node.js进行流媒体播放,但这听起来像是一项有趣的工作。我将使用与您的案例相关的典型解决方案:
设备&gt; ffmpeg(H264 / AAC)&gt; Wowza&gt;混合播放器(Flash + HTML5)。
而不是Wowza你可以使用Red5(免费/开源 - 但最近没有多少活动)。您还可以在RTMP之上查看支持HLS和MPEG DASH的Nginx RTMP module。
对于Flash,我使用Adobe的Strobe支持实时流式传输,并且易于设置和回退到不支持Flash的HTML5。我使用SWFObject lib来检测Flash支持,并将HLS URL提供给移动设备的HTML5视频标记。您可以使用RTSP for Android&lt; 4.1和其他移动设备。
我应该提到的另一件事是实时通讯。对于视频/音频会议,您可以查看WebRTC。这两篇文章应该让你走上正轨。 Here和here。 WebRTC将适用于一对一,一对一,几对少。如果您需要支持更多并发连接,可以查看Licode或tokbox。