6

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

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

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

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

此致,

疯獾

4

10 回答 10

4

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

它不如一个体面的 H264 实现好,但从实现的角度来看,走这条路可以为自己节省很多时间。

看到这个:

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

于 2010-07-13T19:27:38.300 回答
3

您尝试过哪些过滤器?

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

它不是基于 DirectShow,但VLC 媒体播放器可以做到这一切。它基于FFMpeg开源项目。它的某些版本是 LGPL 许可的,因此该库可以合并到您的项目中而没有太多限制。

如果您只需要一组 DirectShow 过滤器来为您处理所有这些,我之前使用MainConcept 的产品取得了不错的效果。不过,它们处于昂贵的一端。

于 2010-07-05T17:12:10.633 回答
1

忘记用于实时流式传输的 WMV 编码。WMV 适用于实时低质量流,但不能实时进行高质量编码。

我建议你看看MainConcept 的 SDK。他们为 H.264 编码做了一系列 DirectShow 过滤器。我已经使用 MainConcept 的编解码器和 DirectShow 过滤器实现了以 H.264 编码的流的实时流传输和复用,这很棒。

希望这可以帮助

于 2010-10-14T21:58:00.337 回答
1

我正在使用 Windows Media Encoder 进行实时编码,即使在 720x576 分辨率下也能正常工作。VideoPhill Recorder就是一个这样的用法示例。

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

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

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

于 2010-10-27T10:34:32.507 回答
1

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

两个不错的是 Theora 和 WebM 视频编码器过滤器(您可以从 xiph.org 的单个安装程序中获取它们)。它们都是高质量的编码器,可以进行调整以平衡性能与质量。WebM 在编码时可以使用多个处理器,这可能对您的情况有所帮助。两者也都与 HTML5 视频一起使用,因此这对您来说可能是一个额外的优势。

于 2010-07-07T19:29:52.037 回答
1

ffdshow 试用利用了 ffmpeg 的 x264 东西,据说速度非常快(无论如何我都这么认为)。libjpeg-turbo 也可能会有所帮助,或者选择其他一些为高吞吐量而设计的编解码器,例如 camstudio 之类的。

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

于 2011-08-04T20:29:02.417 回答
0

这是一种选择: http: //www.codeproject.com/Articles/421869/H-264-CUDA-Encoder-DirectShow-Filter-in-Csharp

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

于 2012-09-13T22:25:17.043 回答
0

你看过这个了吗?

http://www.streamcoders.com/products/rtpavsource.html http://www.streamcoders.com/products/rtpavrender.html

于 2010-07-02T21:50:54.490 回答
0

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

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

于 2012-09-13T12:43:10.140 回答
0

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

于 2015-01-27T23:33:31.770 回答