我正在尝试构建一个过滤器。 它应该有3个视频输入和1个音频输入,并根据固定的架构构建一个vido文件。 此模式的一个示例可能是:“播放第一个源的3秒;然后播放第二个源的3秒;播放第三个源的3秒;重复”
网上有一些关于如何构建过滤器的教程,但我有一些问题:
为此项目使用转换过滤器基类是否正确?
我是否需要创建自定义小键盘?
在哪个函数中,来自源的实际视频传递到过滤器,我可以抓住它?
如何在引脚之间进行某种同步?
假设我只有一个来源:我可以将输入样本的值复制到输出样本吗?
如何将数据发送到输出引脚?
答案 0 :(得分:2)
为此项目使用转换过滤器基类是否正确?
不,在此解释:DirectShow Filter: Transform
我是否需要创建自定义小键盘?
最有可能。您需要进行媒体类型检查,然后您需要将数据传递给过滤器类,并标识接收到的引脚。
在哪个函数中,来自源的实际视频传递到过滤器,我可以抓住它?
您掌握数据的最早点是课堂上输入的IPin::Receive
方法。
如何在引脚之间进行某种同步?
完全取决于您:您应该实现一种输入队列,然后匹配来自输入队列的数据以产生输出。如果您希望它们等到其他输入流保持并提供其数据,您有责任阻止对引脚的执行。
假设我只有一个来源:我可以将输入样本的值复制到输出样本吗?
输入和输出数据作为媒体样本 - 属于分配器的对象。实际复制取决于引脚分配器是相同还是不同,后者是否兼容。总而言之,是的,你可以复制数据。
如何将数据发送到输出引脚?
CBaseOutputPin::Deliver
告诉您(实际上调用连接的下游引脚的IPin::Receive
)。
答案 1 :(得分:0)
为什么你需要一个自己的过滤器?使用DirectShowEditingServices,您可以使用完整的基础架构来构建播放列表。但这仅适用于文件源。
要使用Live-sources,最佳解决方案是GMFBridge。在这里,您可以为源创建1到N个图形,并为您创建一个回放/捕获图形。然后在GMFBridge中,您可以将连接从源切换到回放图。