资源描述:
《directshow实践经验杂谈》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、DirectShow实践经验杂谈1.当向FilterGraph中加入同一个Filter的多个实例时,使用Intelligentconnect,优先使用最晚加入FilterGraph中的那个Filter实例。2.使用IGraphConfig接口可以将Filter加入Cache,以在Intelligentconnect时,提高该Filter的连接优先级。如果要加入Cache的Filter已在Graph中,确信它的所有Pin处于断开状态,而且调用IGraphConfig::AddFilterToCache之后,Graph中的Filter实例会自动Remove掉;当Intelligentco
2、nnect之后,使用了Cache中的某个Filter实例,则这个Filter实例会被自动加入到Graph,而Cache中这个Filter实例也会被Remove掉。3.在调试Filter时,每次进入CheckMediaType的Mediatype,我们在VC中只能看到一串UUID数字,很麻烦!下面的代码能将Mediatype的描述信息Dump到VC的Outputwindow:voidDisplayMediaType(TCHAR*pDescription,constCMediaType*pmt){//DumptheGUIDtypesandashortdescriptionDbgLog((
3、LOG_TRACE,0,TEXT("")));DbgLog((LOG_TRACE,0,TEXT("%s"),pDescription));DbgLog((LOG_TRACE,0,TEXT("")));DbgLog((LOG_TRACE,0,TEXT("MediaTypeDescription")));DbgLog((LOG_TRACE,0,TEXT("Majortype:%s"),GuidNames[*pmt->Type()]));DbgLog((LOG_TRACE,0,TEXT("Subtype:%s"),GuidNames[*pmt->Subtype()]));DbgLog((L
4、OG_TRACE,0,TEXT("Subtypedescription:%s"),GetSubtypeName(pmt->Subtype())));DbgLog((LOG_TRACE,0,TEXT("Formatsize:%d"),pmt->cbFormat));//DumpthegenericmediatypesDbgLog((LOG_TRACE,0,TEXT("Fixedsizesample%d"),pmt->IsFixedSize()));DbgLog((LOG_TRACE,0,TEXT("Temporalcompression%d"),pmt->IsTemporalCompr
5、essed()));DbgLog((LOG_TRACE,0,TEXT("Samplesize%d"),pmt->GetSampleSize()));}4.调试Filter时,想要知道程序是否进入某个函数,可以使用如下的宏定义:#defineDbgFunc(a)DbgLog((LOG_TRACE,0,TEXT("CFltTracer(Instance%d)::%s"),mThisInstance,TEXT(a)));使用方法为:CFltTracer::~CFltTracer(){//Othercleaningwork...DbgFunc("~CFltTracer");}5.如
6、下的代码,可以将DirectShow的错误码以文本的方式显示出来:voidShowError(HRESULThr){if(FAILED(hr)){TCHARszErr[MAX_ERROR_TEXT_LEN];DWORDres=AMGetErrorText(hr,szErr,MAX_ERROR_TEXT_LEN);if(res==0){wsprintf(szErr,"UnknownError:0x%2x",hr);}MessageBox(0,szErr,TEXT("Error!"),MB_OK
7、MB_ICONERROR);}}6.0进行DVcamcorder编程时要注意,当Filter
8、Graph在运行,而将Camcorder置于Paused状态,"MicrosoftDVCameraandVCR"仍然会不停地将Paused时刻的那一帧不断地发送出来(因为DirectShow主要是为Playback设计的,所以这一点对于压缩、合成、写文件的应用非常头疼),送出的Sample时间戳线性递增;而将Camcorder置于Stopped状态,"MicrosoftDVCameraandVCR"也就不再送出数据。而FilterGraph上的Pause、