如何在DirectShow中使用分段输出文件进行预览和捕获?

时间:2019-01-10 19:58:19

标签: webcam video-capture directshow directshow.net

我正在使用c#和DirectShow.NET,以及在网上找到的一些示例代码,试图将当前的网络摄像头输出实时显示在应用程序的窗口中,并将视频输出到文件中。

当前,我正在使用ICaptureGraphBuilder2创建图并输出一个输出文件,它可以工作。但实际上我有一个更详细的要求,我无法弄清楚如何实现:

在录制时,我希望能够将输出切成5分钟的片段,例如ffmpeg中的-segment参数。据我所知,ICaptureGraphBuilder2为您选择了文件编写器,而默认编写器只是不断追加到同一文件。如何定制?我该如何实现自定义编写器,并让图代替它使用?

1 个答案:

答案 0 :(得分:1)

主要是因为API本身属于远古时代,而对长录音进行分段并不是最重要的功能,因此使用DirectShow进行分段编写并不容易。使用操作系统提供的标准API是不可能的,并且需要第三方过滤器和/或开发方面的一些努力。

您遇到的基本问题是媒体管道不允许部件的状态转换:关闭,确定,重新打开和分段写入的文件时,无法激活网络摄像头。

因此,您必须通过以下两种方式之一来应对挑战:

  1. 您可以用自定义过滤器替换多路复用器和写入器过滤器,以在内部对记录进行分段,并在不丢失帧的情况下最终确定从新文件开始的当前文件。

在进行C#开发时,此选项基本上表明您可能会发现可以使用实现必要功能的第三方过滤器。

  1. 您可以构建一个包含两图的设计,其中一个图具有网络摄像头捕获功能并可以选择进行压缩,然后另一个图具有压缩功能,第一个不具有压缩功能并实际记录到文件中。然后,数据在图形之间传输,并且在进行分段时,您停止第二个图形来定稿文件,然后在该文件中开始新文件,并且第一个图形始终在运行,而不会中断提供新的视频帧。连接到图形的胶合层可以定制开发,也可以查看GMFBridge filters,它们很流行,并被很多用户使用。

就我所知,您可以使用GMFBridge构建带有输出文件分段的两图拓扑,即使这可能需要您检查源代码以找出如何正确使用过滤器以及制作过滤器需要什么在这种实时视频捕获场景中工作。