使用...进行实时视频编码?

时间:2013-12-27 02:43:38

标签: .net ffmpeg webcam directshow encode

我正在尝试编写一个相当简单的应用程序,它将视频/音频从网络摄像头传输到互联网上的其他人(ala Skype,但有更多的控制权)。

关于这个主题似乎没有什么有用/相关的信息,我能找到的内容基本上已经过时了。从我到目前为止的研究x264 seems to be the way to go,因为它提供了ultrafast选项,专为此情况而设计

我可以打开网络摄像头并接收图像流。我也可以听音频设备并获取样品。

我失败的地方就是以这样的方式对信息进行编码,以便能够以最小的延迟进行流式传输(从我读过的内容来看,200ms延迟是没有明显滞后的目标,包括网络延迟 - 所以让我们的目标是100-150毫秒)

我尝试过的事情

的ffmpeg

这似乎是最广泛使用的编码选项。我有两个使用它的真正问题。首先,即使使用没有前瞻的x264和用于稳定性的最小缓冲区,使用image2pipe的延迟似乎也在700毫秒左右。其次,它需要安装ffmpeg - 能够在没有外部依赖的情况下执行此操作会很好。

VLC

与ffmpeg一样,这需要一个负面的外部程序。更糟糕的是,我似乎无法获得不到2秒的延迟,这似乎随着时间的推移而增加。我也只能让VLC捕获相机本身,而不是拍摄一系列图像,这意味着我没有机会对它们进行预处理。

DirectShow的

我见过许多网站建议使用Windows直接显示编码器,但我找不到一个可以在任何实时工作的网站。实际上,我唯一能够可靠地实现的是Windows Media编解码器,它具有大量的延迟和相当大的尺寸。

其他考虑因素

以上都没有解决向视频添加音频流的问题。我不确定是否应该尝试将它们编码在一起,或者在视频旁边发送单独的流。

简而言之,我已经谷歌搜索了一个星期左右,并没有找到一个体面的方式来做到这一点。有人可以指点我一个体面的例子/指南吗?

1 个答案:

答案 0 :(得分:1)

一种方法是通过DirectShow甚至Video for Windows使用x264vfw。此编解码器具有“零延迟”选项,它基本上适用于“帧内帧外”模式。我描述了如何在DirectShow应用程序here中减少x264编码延迟。