C++ Directshow仅预览和捕获&;使用单个图形预览
我有一个Directshow应用程序,需要预览网络摄像头视频,当用户单击“录制”时,它需要开始将视频捕获到文件中 为此,我创建了一个捕获图,预览管脚连接到渲染过滤器,捕获管脚连接到保存到文件的AVI_MUX过滤器 它看起来像这样:C++ Directshow仅预览和捕获&;使用单个图形预览,c++,video,directshow,capture,preview,C++,Video,Directshow,Capture,Preview,我有一个Directshow应用程序,需要预览网络摄像头视频,当用户单击“录制”时,它需要开始将视频捕获到文件中 为此,我创建了一个捕获图,预览管脚连接到渲染过滤器,捕获管脚连接到保存到文件的AVI_MUX过滤器 它看起来像这样: /[PREVIEW PIN]-->[VIDEO_RENDERER]--->[SCREEN] [VIDEO CAPTURE FILTER] / \
/[PREVIEW PIN]-->[VIDEO_RENDERER]--->[SCREEN]
[VIDEO CAPTURE FILTER] /
\
\[CAPTURE PIN]--->[AVI_MUX]--->[FILE WRITER]
当我在图形上调用Run()时,视频会显示在屏幕上并正确保存到文件中
我的问题是,如何只运行图的预览PIN部分而不运行CAPTURE_PIN部分
我最初的想法是手动启动/停止各个过滤器,但后来我查看了Microsoft的Directshow amcap示例,它们实际上创建了两个独立的图形。一个用于预览,一个用于捕获。如果用户想要预览视频,他们会破坏捕获图并创建预览图。如果用户想要录制视频,他们会破坏预览图并创建捕获图
这似乎有点浪费,特别是因为单个图形已经包含预览和捕获引脚。这里的正确方法是什么?过滤器图形可以作为一个整体更改状态,您不能单独或单独运行其部分 最简单的解决方案是单独构建预览图,当需要开始录制时,停止/关闭预览图并重建新的捕获图。这当然会涉及到响应“开始录制”命令的一定延迟
另一种选择是使用多个图形,在两个图形之间共享数据,分别使用代码或启动/停止图形。您可以尝试在两个不同的图形之间切换: 1) 第一个简单的图形,用户只需观看即可
2) 第二个复杂的图形,比用户同时观看和记录要复杂得多这就是我最后要做的。看起来像是浪费。