Directshow仅预览和捕获&使用单个图表进行预览

时间:2012-08-16 14:51:57

标签: c++ video directshow capture preview

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

为此,我创建了一个Capture Graph,PREVIEW引脚连接到RENDER滤波器,CAPTURE引脚连接到保存到文件的AVI_MUX滤波器。

它看起来像这样:

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

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

我的问题是,如何在没有CAPTURE_PIN部分的情况下只运行图表的PREVIEW PIN部分。

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

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

2 个答案:

答案 0 :(得分:2)

过滤器图形可以整体改变状态,不能单独和单独运行其部件。

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

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

答案 1 :(得分:1)

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

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

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