DirectShow BaseClasses - 具有视频和输入引脚的视频渲染器类

时间:2010-10-13 12:56:16

标签: c++ com filter rendering directshow

我在BaseClasses中找不到合适的渲染器类,它有2个输入引脚 - 一个用于视频,一个用于音频。任何人都可以推荐/提供一些代码吗?

此致 多米尼克

3 个答案:

答案 0 :(得分:1)

CBaseRenderer类是实现渲染器过滤器的基类。它只支持一个输入引脚。

我从未遇到过处理音频和视频的渲染器类,它们总是通过单独的渲染器滤镜进行渲染。

VMR9 renderer(CLSID_VideoMixingRenderer9)非常适合呈现视频,而DirectSound Renderer(CLSID_DSoundRender)则用于呈现音频。

您是否可能尝试将两个流写入媒体文件中的磁盘?然后,您将需要一个能够理解两种媒体类型的多路复用过滤器。由于我不知道您正在使用哪种媒体类型,我建议您查看AVI Mux filter,这可以完成这项工作。

我希望这能指出你正确的方向;)

答案 1 :(得分:1)

或者,您可以在视频和音频编码器之后将样本采集器过滤器添加到媒体管道,并将媒体打包并在样本采集器回调中传送RTP数据包。样本采集器可以连接到NULL渲染器。这样您就可以避免编写过滤器并专注于网络传输。

此外,您应该考虑是否要复用流:RTP中的通常视频和音频在单独的RTP会话中传送。如果您仍想编写具有多个输入引脚的滤波器,您可以查看我为http://sourceforge.net/projects/videoprocessing/提供的视频混音器编写的一些基类作为起点。

答案 2 :(得分:0)

据我所知,没有任何MSDN样本有多个输入引脚,这是一个遗憾的遗漏。

GDCL mp4多路复用器写得很好,有多个输入引脚,源代码可以在相当自由的许可证上使用。它是由DirectShow的原始架构师之一编写的“参考质量”。尽管mp4处理相当复杂,但它的DirectShow方面相当简单。 GDCL mp4 filters

大多数具有多个输入引脚的滤波器会将输入引脚的输入数据排入某种类型的队列中,这些队列由生成文件输出文件的工作线程处理,或者在输出引脚或引脚上发送处理后的数据。基类中的CQueue是一个很好的起点,当一个队列在空/满时阻止读者/作者,虽然它需要一些额外的工作来支持停止和刷新。 CAMThread是工作线程的有用起点 - 请参阅CSource以获取示例实现。

其他参考资料 How to make a DirectShow Muxer Filter - Part 1 How to make a DirectShow Muxer Filter - Part 2