DirectShow中,如果想将一路流分解成两路进行不同的处理,比较简单的是加入一个SmartTee,但是要注意,SmartTee的Preview端子输出的流,将会取消时间戳。
在把SmartTee与其他filter连接起来时,要注意:不能将SmartTee当作ICaptureGraphBuilder2::RenderStream()的pSource参数来使用,估计是因为SmartTee的输出Pin并非采用PinCategory.Capture或PinCategory.Preview模式,所以只能通过查找名称或输出Pin序号的方式来获得希望作为源的Pin,然后使用IGraphBuilder::Connect()来连接SmartTee的某个输出Pin和下一个filter的输入Pin。
SmartTee的两个端子名称分别为“Preview”和“Capture”,其中,Capture Pin在输出端子中序号为0,Preview Pin在输出端子中序号为1。
以上引自 :http://hi.baidu.com/highsun_gao/blog/item/bb4fed1748705a0b4b90a7d6.html
我也是的确没有实现用RenderStream 来动态链接 filter
hr = i_pCapture->RenderStream(NULL, NULL, pCaptureFilter, NULL,m_pSmartTee);
hr = i_pCapture->RenderStream(NULL,NULL,m_pSmartTee,NULL,m_pPreview);
hr = i_pCapture->RenderStream(NULL,&MEDIATYPE_Video,m_pSmartTee,NULL,pAsfWriter);
hr = i_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Audio,pSoundFilter,NULL,pAsfWriter);
有预览 但是保存的文件一直都是在9点几K. 如果注释掉 预览 保存又没问题了。 不解了。。。。
可能真的就像上个帖子说的 只能用PIN来连接。。。。 或者直接按照DirectShow SDK 的Combining Video Capture and Preview 中所说 按照第一种方法:
hr = i_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,pCaptureFilter, NULL, NULL);
hr = i_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pCaptureFilter,NULL,pAsfWriter);
hr = i_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Audio,pSoundFilter,NULL,pAsfWriter);
如果那个大哥实现了RenderStream SmartTee 希望 不吝赐教