如何在directshow中开发视频组合器/构建器过滤器

时间:2014-02-27 14:39:56

标签: c++ filter directshow

我正在尝试构建一个过滤器。 它应该有3个视频输入和1个音频输入,并根据固定的架构构建一个vido文件。 此模式的一个示例可能是:“播放第一个源的3秒;然后播放第二个源的3秒;播放第三个源的3秒;重复”

网上有一些关于如何构建过滤器的教程,但我有一些问题:

为此项目使用转换过滤器基类是否正确?

我是否需要创建自定义小键盘?

在哪个函数中,来自源的实际视频传递到过滤器,我可以抓住它?

如何在引脚之间进行某种同步?

假设我只有一个来源:我可以将输入样本的值复制到输出样本吗?

如何将数据发送到输出引脚?

2 个答案:

答案 0 :(得分:2)

  

为此项目使用转换过滤器基类是否正确?

不,在此解释:DirectShow Filter: Transform

  

我是否需要创建自定义小键盘?

最有可能。您需要进行媒体类型检查,然后您需要将数据传递给过滤器类,并标识接收到的引脚。

  

在哪个函数中,来自源的实际视频传递到过滤器,我可以抓住它?

您掌握数据的最早点是课堂上输入的IPin::Receive方法。

  

如何在引脚之间进行某种同步?

完全取决于您:您应该实现一种输入队列,然后匹配来自输入队列的数据以产生输出。如果您希望它们等到其他输入流保持并提供其数据,您有责任阻止对引脚的执行。

  

假设我只有一个来源:我可以将输入样本的值复制到输出样本吗?

输入和输出数据作为媒体样本 - 属于分配器的对象。实际复制取决于引脚分配器是相同还是不同,后者是否兼容。总而言之,是的,你可以复制数据。

  

如何将数据发送到输出引脚?

CBaseOutputPin::Deliver告诉您(实际上调用连接的下游引脚的IPin::Receive)。

答案 1 :(得分:0)

为什么你需要一个自己的过滤器?使用DirectShowEditingServices,您可以使用完整的基础架构来构建播放列表。但这仅适用于文件源。

要使用Live-sources,最佳解决方案是GMFBridge。在这里,您可以为源创建1到N个图形,并为您创建一个回放/捕获图形。然后在GMFBridge中,您可以将连接从源切换到回放图。