DirectShow中的实时视频编码

时间:2010-07-02 15:22:52

标签: encoding directshow cuda real-time opencl

我开发了一个Windows应用程序,使用DirectShow从外部设备捕获视频。图像分辨率为640x480,无压缩保存的视频尺寸非常大(每秒约27MB)。

我的目标是尽可能减小这个尺寸,所以我正在寻找一种可以让我实时压缩视频的编码器。它可以是H.264,MPEG-2或其他任何东西。它必须允许我将视频保存到磁盘,最好是我也可以通过网络实时流式传输(Wi-Fi,所以大小应该是每秒1MB左右,或更少)。重大的质量损失是不可接受的。

我发现为此任务获取适当的DirectShow过滤器非常困难。可以假设客户机是相当现代的(快速双核CPU)并且可以使用CUDA / OpenCL。有一些应用程序允许使用CUDA编码视频并提供良好的性能,但是我没有找到适当的DirectShow过滤器或可用于开发一个的API。 NVIDIA nvcuvenc.dll似乎有私有API,因此我无法直接使用它。我找到的任何基于CPU的编码器对我的要求都太慢了,但也许我错过了一些。

有人可以向我推荐一个解决方案,即可以在封闭源应用程序中使用的编码器(付费或免费),无论是使用CPU / CUDA / OpenCL还是DirectCompute,都可以获得良好的性能?或者我应该使用一些外部硬件视频编码器?

致以最诚挚的问候,

madbadger

10 个答案:

答案 0 :(得分:4)

由于您正在使用Directshow,到目前为止最简单的方法是在ASF容器中使用WMV9。这很容易,因为它几乎可以在所有Windows机器上使用(非常少的安装时间依赖性),速度相当快(在相当现代的机器上使用它应该没有问题)并且质量合理。但考虑到您的限制为8 mbit / sec(1 MB /秒),质量对您来说不是问题。 2 mbit / sec,VGA分辨率的WMV9看起来应该不错。

它并不像H264那样好,但从实施的角度来看,你可以通过这条路线节省很多时间。

见:

http://msdn.microsoft.com/en-us/library/dd375008%28v=VS.85%29.aspx

答案 1 :(得分:3)

您尝试过哪些过滤器?

如果你只处理640x480,那么任何合理质量的商业软件编码器都应该没问题,只要你选择一个真实的比特率。不需要使用Cuda或OpenCL进行硬件加速。 H264需要更多的马力,并且需要更多的CPU核心,但Mpeg2或任何h263时代的编解码器(xvid,wmv9,divx等)即使在适度的CPU上也应该没有问题。同时在网络上流式传输需要花费更多的精力,但仍然应该可行。

它不是基于DirectShow的,但VLC Media Player可以做到这一切。它基于FFMpeg 开源项目。它的某些版本是LGPL许可的,因此库可以在没有很多限制的情况下整合到您的项目中。

如果你只想要一套能够为你处理这一切的DirectShow过滤器,那么我之前的MainConcept's产品已经取得了不错的效果。尽管如此,它们仍处于昂贵的一端。

答案 2 :(得分:1)

你没有指定你尝试过的过滤器,或者质量损失意味着什么'重要',所以我怀疑我们能做的最好的是建议一些编码器试着看看它们是否符合你的要求。

两个好的是Theora和WebM视频编码器过滤器(您可以从xiph.org的单个安装程序获取它们)。它们都是高质量的编码器,可以通过调整来平衡性能和质量。 WebM在编码时可以使用多个处理器,这可能对您的情况有所帮助。两者都使用w / HTML5视频,因此对您来说可能是额外的加分。

答案 3 :(得分:1)

忘记用于实时流媒体的WMV编码。 WMV适用于实时低质量流,但它不能实时进行高质量编码。

我建议你看看MainConcept's SDK。他们使用一系列DirectShow过滤器来编码H.264。我使用MainConcept的编解码器和DirectShow过滤器实现了H.264编码流的实时流和多路复用,非常棒。

希望这有帮助

答案 4 :(得分:1)

我正在使用Windows Media Encoder进行实时编码,即使在分辨率为720x576的情况下也能正常工作。其中一个例子就是VideoPhill Recorder

它是用纯.NET编写的,DirectShow.NET用于捕获,windowsMedia.NET用于编码。

使用这两个,我能够实现24/7稳定性的实时编码。

这两个库都可以在Windows上免费使用,因此除了操作系统之外,您无需支付任何许可证。

答案 5 :(得分:1)

ffdshow试用版充分利用ffmpeg的x264内容,据说速度非常快(我认为无论如何)。另外libjpeg-turbo可能会有所帮助,或者选择其他一些针对高吞吐量的编解码器,如camstudio或其他。

更新:ffmpeg现在可以接受directshow输入:http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27

答案 6 :(得分:0)

答案 7 :(得分:0)

如果您可以保持在1280x1024或以下,Micorsofts MPEG-2编码器(包含在Vista及以上版本)相当不错。

我根本没有让它适用于1080p内容。我怀疑编码器只是中止了。羞。

答案 8 :(得分:0)

以下是一个选项:http://www.codeproject.com/Articles/421869/H-264-CUDA-Encoder-DirectShow-Filter-in-Csharp

它使用我的cpu(p4 3ghz)的大约10%来在图形编辑中将SD视频编码为h264。

答案 9 :(得分:0)

请参阅CaptureDS附带的AVBlocks C#示例。它展示了如何使用AVBlocks和DirectShow构建录像机。 DirectShow用于视频捕获,AVBlock用于视频编码: