webcam - 如何使用分段输出文件在 DirectShow 中预览和捕获?
问题描述
我正在使用 c# 和 DirectShow.NET,以及一些在线找到的示例代码,尝试将当前的网络摄像头输出实时显示到我的应用程序的窗口中,并将视频输出到文件中。
目前,我正在使用ICaptureGraphBuilder2
创建图形并输出单个输出文件并且它可以工作。但我实际上有一个更详细的要求,我无法弄清楚如何实现:
录制时,我希望能够将输出切成 5 分钟的片段,就像ffmpeg-segment
中的参数一样。据我所知,为您选择文件编写器,默认编写器只是不断附加到同一个文件。这个怎么定制?我如何实现自定义编写器并让图形使用它呢?ICaptureGraphBuilder2
解决方案
主要是因为API本身属于古代,分段长录音不是最重要的功能,所以用DirectShow做分段编写并不容易。使用操作系统提供的标准 API 是不可能的,并且需要在第三方过滤器和/或开发方面付出一些努力。
您遇到的根本问题是媒体管道不允许部件的状态转换:当写入的文件关闭、完成、重新打开和分段时,您不能激活网络摄像头。
因此,您必须通过以下两种方式之一来应对挑战:
- 您可以用内部分段录制的自定义过滤器替换多路复用器和写入器过滤器,并最终确定当前文件开始新文件而不会丢失帧。
当您进行 C# 开发时,此选项基本上表明您可能已准备好使用实现必要功能的第三方过滤器。
您可以构建一个两图设计,其中一个具有网络摄像头捕获和可选压缩,然后另一个具有压缩是第一个没有它并实际记录到文件中。然后数据在图表之间传输,当涉及到分段时,您停止第二个图表完成文件,然后在那里启动新文件,第一个图表始终运行而不会中断提供新的视频帧。连接到图形的粘合层可以自定义开发,或者您可以查看流行且被相当多的用户使用的GMFBridge 过滤器。
据我所知,您可以使用 GMFBridge 构建带有输出文件分段的两图拓扑,即使它可能需要您检查源代码以了解过滤器的正确使用方式以及使它们在此工作所需的条件实时视频捕获的场景。
推荐阅读
- javascript - 根据下拉选择显示 div
- python - Python subplot 设置多轴属性
- python - 如何在给定位置选择包含特定子字符串的行 - python
- java - Spring Boot 中 PATCH 方法没有响应
- spring-boot - 混淆 Maven 多模块 Spring Boot 项目
- javascript - 为什么回调函数将 null 作为第一个参数?
- java - 为什么我的变量在调用它的 getter 时会发生变化?
- android - 在 Android 中放大 Auth,无法访问管理查询 API
- swift - 如果允许重复点赞,在新的点赞条目替换旧点赞且不计入点赞数的情况下,如何将点赞数加 1?
- android - 如何将字符串从应用程序传递到另一个应用程序?