当前位置: 代码迷 >> 多媒体/流媒体开发 >> 使用directshow自己写的一个多输入单输出的filter,遇到特别奇怪的有关问题,项目急需,
  详细解决方案

使用directshow自己写的一个多输入单输出的filter,遇到特别奇怪的有关问题,项目急需,

热度:10321   发布时间:2013-02-26 00:00:00.0
使用directshow自己写的一个多输入单输出的filter,遇到特别奇怪的问题,项目急需,高手请进!
由于项目需要,我参考sdk的demo中的Inftee(单输入多输出)写了一个多输入单输出的filter,在我的filter中,共有5个输入流,一个输出流,其中一个输入流是采集摄像头的,其他4个是gif图片源。我继承的CBasefilter、CBaseOutputPin、CBaseInputPin。在输入pin的Receive方法中,我做了一些处理。断点调试发现,在进入Receive方法两次之后,录像就卡住了。我是通过循环迭代产生的输入pin。代码如下:
	for (int i=0;i<EFFECT_MAX_COUNT;i++)
{
WCHAR szbuf[20]; 
HRESULT hr = NOERROR;
(void)StringCchPrintfW(szbuf, NUMELMS(szbuf), L"Effect%d\0", i);
pInputPin=new InsertEffectInputPin(NAME("Effect Input"),this,&hr,szbuf);
if (FAILED(hr) || pInputPin == NULL)
{
delete pInputPin;
pInputPin=NULL;
}
else
{
pInputPin->flag=i;
pInputPin->AddRef();
m_InputPinsList.AddTail(pInputPin);
}
Samplelist[i]=new MySample(NULL,FALSE);
}

这里EFFECT_MAX_COUNT=5;如果我将EFFECT_MAX_COUNT=1,传输没什么问题,这相当于自己实现了一个transform filter。所以我怀疑是不是在多输入的时候需要重载一些方法来实现同步控制之类的。当然我在自己的输入pin中已经重载了很多方法:CheckMediaType(const CMediaType *pmt);
HRESULT SetMediaType(const CMediaType *pmt);
HRESULT BreakConnect();
int GetEffectSampleCount();
IMediaSample* GetEffectSampleFromSampleList(int n);
virtual HRESULT CompleteConnect(IPin *pReceivePin);
STDMETHODIMP NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly);
STDMETHODIMP EndOfStream();
STDMETHODIMP BeginFlush();
STDMETHODIMP EndFlush();
STDMETHODIMP NewSegment(REFERENCE_TIME tStart,REFERENCE_TIME tStop,double dRate);
        STDMETHODIMP Receive(IMediaSample *pSample);没发现什么同步控制的方法,而且我是想将其他4个输入pin传过来的sample放到一个输入pin中,然后作为一个sample传到outpin中。难道是需要在输出pin端重载什么方法??项目急需,这个问题已经困扰我好多天了,求高手指教啊!

------解决方案--------------------------------------------------------
各个输入相互独立,其中4个gif的输入,不调用输出pin的方法向下传递,只是自己保存数据而已.
只用camera的输入向下游传递就可以了.在这里从其他4个保存的数据取来处理就行,比如叠加
  相关解决方案