1

我有一个需要预览网络摄像头视频的 Directshow 应用程序,当用户单击“录制”时,它需要开始将视频捕获到文件中。

为此,我创建了一个捕获图,其中 PREVIEW 引脚连接到 RENDER 过滤器,CAPTURE 引脚连接到保存到文件的 AVI_MUX 过滤器。

它看起来像这样:

                        /[PREVIEW PIN]-->[VIDEO_RENDERER]--->[SCREEN]
[VIDEO CAPTURE FILTER] /
                       \
                        \[CAPTURE PIN]--->[AVI_MUX]--->[FILE WRITER]

当我在图表上调用 Run() 时,视频会显示在屏幕上并正确保存到文件中。

我的问题是,我怎样才能只运行图表的 PREVIEW PIN 部分而没有 CAPTURE_PIN 部分。

我最初的想法是手动启动/停止相应的过滤器,但后来我查看了 Microsoft 的 Directshow amcap 示例,它们实际上创建了两个单独的图表。一个用于预览,一个用于捕获。如果用户想要预览视频,他们会破坏捕获图并创建预览图。如果用户想要录制视频,他们会破坏预览图并创建捕获图。

这似乎有点浪费,特别是因为单个图表已经包含 PREVIEW 和 CAPTURE 引脚。这里的正确方法是什么?

4

2 回答 2

2

过滤器图可以作为一个整体改变状态,你不能单独和分开运行它的部分。

最简单的解决方案是单独构建预览图,当您需要开始录制时,停止/关闭预览图并重建新的捕获图。这肯定会涉及响应“开始录制”命令的一定延迟。

另一种选择是使用多个图表,在两者之间共享数据,在代码中或使用“桥接”,并分别启动/停止图表。

于 2012-08-17T06:49:19.487 回答
1

您可以尝试在两个不同的图表之间切换:

1)第一个简单的图表,而不是用户只看

2)第二个复杂图,比用户同时观看和记录

于 2012-08-17T07:04:37.263 回答