c++ - Directshow Preview Only 和 Capture & Preview with a single Graph

标签 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() 时,视频会显示在屏幕上并正确保存到文件中。

我的问题是,我如何才能只运行图表的 PREVIEW PIN 部分而不运行 CAPTURE_PIN 部分。

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

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

最佳答案

Filter graph 可以作为一个整体改变状态,你不能单独单独运行它的一部分。

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

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

关于c++ - Directshow Preview Only 和 Capture & Preview with a single Graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11989883/

相关文章:

c++ - 模拟视频标准对话框

c++ - DirectShow - 获取视频帧

c++ - 在 C++ 中计算方程解

c++ - 避免 C++(部分)模板特化中的代码重复

c++ - 在 WM_MOUSEMOVE 中拖动并绘制边框?

c++ - 为什么我的类构造函数没有按预期工作?

cocoa - QTMovie 是否处理 URL 重定向?

algorithm - 从原始视频中获取运动向量

android - ThumbnailUtils.createVideoThumbnail 对于现有 mp4 视频返回 null

c++ - 使用 Kinect SDK 和 C++ 的 Kinect 音频