锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
pdf
1.
搴旂敤紼嬪簭閫氳繃璋冪敤filter graph 綆$悊鍣ㄦ柟娉曟潵榪炴帴filter.
搴旂敤紼嬪簭璋冪敤IFilterGraph::ConnectDirect
IGraphBuilder::Connect鏉ユ寚瀹氫笉鍚岀殑filter鐩存帴榪炴帴錛?br> 涔熷彲鐢↖GraphBuilder::RenderFile鑷姩瀹炵幇榪炴帴
搴旂敤紼嬪簭鍙互閫氳繃IFilterGraph::AddFilter灝唂ilter 娣誨姞graph涓紝
褰撲竴涓猣ilter琚坊鍔犲埌graph涓椂錛宖ilter鍥捐〃綆$悊鍣ㄩ氳繃IBaseFilter::JoinFilterGraph鏉ラ氱煡filter.
榪欑偣璇存槑, 涓嶆槸filter鐨勭洿鎺ヨ繛鎺ュ嚱鏁扮浉浜掗摼鎺?鑰屾槸鍦ㄤ互涓婂唴閮ㄨ皟鐢ㄥ疄鐜扮殑.
2. 鑰冭檻鍒頒互鍓嶆弿榪?br> FilterA ---->FilterB
鐨勮繛鎺ユ鏌ュ獟浣撶被鍨?閫昏緫鍩烘湰灝辨槸榪欐牱:
寰幆FilterA鐨勮緭鍑簆in,鍐嶅驚鐜疐ilterB鐨勮緭鍏in濯掍綋綾誨瀷鏄惁鍜宲mt濯掍綋綾誨瀷
鍖歸厤
for (j = 0 ; j<FilterB.PinIn.MediaTypeCount; j++)
{
if (FilterB.PinIn.MediaType[j] = pmt )
{
if(FilterA.PinIn.ReceiveConnection(FilterA.PinOut, FilterB.MediaType[i]) = OK)
return TRUE;
}
}
for (i= 0; i< FilterA.PinOut.MediaTypeCount; i++)
{
if (FilterA.PinOut.MediaType[i] 鏄惁鍦‵ilterB.PinIn涓槸鍚︽敮鎸?
if (FilterA.PinIn.ReceiveConnection(FilterA.PinOut, FilterA.MediaType[i]) = OK)
return TRUE;
}
鍦ㄥ疄鐜頒笂,璋冪敤嬈″簭浠ヤ笅榪囩▼:
filterGraph棣栧厛璋冪敤FilterA.PinOut::Connect().
FilterA.IPinOut::Connect()
鍘熷瀷:IPin::Connect(IPin* pReceivePin, const AM_MEDIA_TYPE * pmt)
璇onnect鍙傛暟涓?br> pReceivePin 涓?FilterB鐨勮緭鍏in,
pmt 鏄疐ilterA鐨勫綋鍓嶅獟浣撶被鍨?
鍦ㄥ唴閮ㄨ皟鐢?涓昏)
hr = AgreeMediaType(pReceivePin, pmt);
媯鏌ReceivePin 鏈夊惁pmt鐨勫獟浣撶被鍨?
鏈?鍒欒嚜鐒秓k
娌℃湁,澶辮觸,閫鍑鴻鍑芥暟.
鍒欏湪AgreeMediaType鍋氫簡浠ヤ笂閫昏緫寰幆.
IPin::AgreeMediaType鍑芥暟澶勭悊濡備笅:
1.鍒ゆ柇pmt 鏄惁鏄畬鍏ㄥ獟浣撶被鍨?鏄垯鎸夊叏濯掍綋綾誨瀷妯″紡鍑烘潵
2.闈炲畬鍏ㄥ獟浣撶被鍨?br> IPin::EnumMediaTypes(IEnumMediaTypes** pEnum)
鑾峰彇鏋氫婦鎸囬拡(鎸囧悜Pin涓殑濯掍綋綾誨瀷闆嗗悎).
鍏堟灇涓緁ilterB鐨勮緭鍏in鐨勫獟浣撶被鍨嬬殑鏋氫婦闆?
璋冪敤TryMediaTypes 鍑芥暟鍘誨垽鏂槸鍚﹀尮閰?
榪樹笉鍖歸厤,鍙栧嚭FilterA鐨勬灇涓劇被鎸囬拡.鍐嶈皟鐢═ryMediaTyes
IPin::TryMediaType()澶勭悊
鍘熷瀷:
HRESULT CBasePin::TryMediaTypes(IPin*pReceivePin, const CMediaType*pmt,
IEnumMediaType *pEnum)
鍦ㄨ鍑芥暟澶勭悊:
for (pmt in 鎵鏈夎鏋氫婦闆嗕腑鐨勬灇涓懼獟浣撶被鍨?)
{
AttemptConnect(pReceivePin, pmt)
}
鍦ˋttemptConnection涓皟鐢?br> CBasePin::AttemptConnection(IPin* pReceivePin, const CMediaType*pmt)
媯鏌ilterA 鐨凜heckConnect(pReceivePin)
FilterA鐨凱InOut::CheckMediaType(pmt)
ok,return
FilterA鐨凱inOut::SetMediaType(pmt)
pReceivePin->ReceiveConnection(...) (filterB 鐨凱inIn)
ok,return
FilterA鐨凱inOut::CompleteConnect(pReceivePin)
typedef struct _MediaType {
GUID majortype;
GUID subtype;
BOOL bFixedSizeSamples;
BOOL bTemporalCompression;
ULONG lSampleSize;
GUID formattype;
IUnknown *pUnk; //not use
ULONG cbFormat;
BYTE *pbFormat;
} AM_MEDIA_TYPE;
涓昏鏈?br> majortype 濯掍綋綾誨瀷澶ц嚧璇存槑
subtype 鏇翠竴姝ョ殑緇嗚嚧璇存槑
formattype
鍖呮嫭鏈変互涓嬶細鍏跺搴旂殑涓嶅悓鐨勬暟鎹牸寮?br> FORMAT_None
FORMAT_DvInfo
FORMAT_MPEGVideo
FORMAT_MPEG2Video
FORMAT_VideoInfo
FORMAT_VideoInfo2
FORMAT_WaveFormatEx
GUID_NULL
cbForamt鎴愬憳鎸囧畾浜嗘牸寮忓潡pbFormat鐨勫ぇ灝?
pbFormat鎸囬拡鎸囧悜鏍煎紡瀛愬潡銆?br> pbFormat鏄竴涓獀oid*鐨勬寚閽堬紝鍥犱負鏍煎紡鍧椾細鍥犱負濯掍綋綾誨瀷
鐨勪笉鍚岃屾湁涓嶅悓鐨勬寚鍚戙傚闊抽濉厖鐨勬槸WAVEFORMATEX緇撴瀯
鏁版嵁.
鍙互浠庝腑鍙栧嚭浼犳潵鐨勬暟鎹牸寮忋?br>
//TWaveFormatEx 緇撴瀯:
TWaveFormatEx = packed record
wFormatTag: Word; {鎸囧畾鏍煎紡綾誨瀷; 榛樿 WAVE_FORMAT_PCM = 1;}
nChannels: Word; {鎸囧嚭娉㈠艦鏁版嵁鐨勯氶亾鏁? 鍗曞0閬撲負 1, 绔嬩綋澹頒負 2}
nSamplesPerSec: DWORD; {鎸囧畾鏍鋒湰閫熺巼(姣忕鐨勬牱鏈暟)}涓鑸負8000
nAvgBytesPerSec: DWORD; {鎸囧畾鏁版嵁浼犺緭鐨勫鉤鍧囬熺巼(姣忕鐨勫瓧鑺傛暟)} 姣忕鐨勫瓧鑺傛暟:
nBlockAlign: Word; {鎸囧畾鍧楀榻?鍗曚綅瀛楄妭), 鍧楀榻愭槸鏁版嵁鐨勬渶灝忓崟浣峿
wBitsPerSample: Word; {閲囨牱澶у皬(瀛楄妭)}姣忎釜鏍鋒湰鐨凚IT鏁扮洰錛屼竴鑸負16
cbSize: Word; {搴旇鏄緇撴瀯鐨勫ぇ灝弣
end;
nChannels : 瀵逛簬pcm,鍏秐channels涓嶈秴榪?,瀵逛簬闈瀙cm鏍煎紡,鍒欒秴榪?.
nSamplesPerSec : 閫氬父涓?kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
nAvgBytesPerSec : 姣忕浼犻佸瓧鑺傛暟 = nSamplesPerSec * nBlockAlign
nBlockAlign : 瀵歸綈瀛楄妭 = nChannels * wBitsPerSample / 8
灝辨槸琛ㄧず涓涓牱鏈殑鏈灝忓瓧鑺?
wBitsPerSample : 鍦ㄦ牸寮忛粯璁ゆ儏鍐典笅,涓鑸負8,16,琛ㄧず鐨勬槸鏍鋒湰鐨刡it 鏁?/p>
瀵逛簬涓涓?浣?11k浼犺緭鐨勭珛浣撳0鍒?br>nChannels = 2
nSamplesPerSec(姣忕鐨勬牱鏈暟) = 11025 灝辨槸鍙栨牱鏁?br>nBlockAlign = 2 * 8 / 8= 2 瀵歸綈瀛楄妭錛屾渶灝忔牱鏈瓧鑺傛暟
nAvgBytesPerSec = 11025 * 2 = 22050
wBitsPerSample = 8
涓嬮潰鐨勫浘鍒楁竻妤氫粠鍙︿竴涓柟闈㈣〃杈炬牱鏈?br>
| 鏍鋒湰1 | 鏍鋒湰2 | ...n | |
| 8浣嶅崟澹伴亾 | 0澹伴亾 | 0澹伴亾 | |
| 8浣嶇珛浣撳0 | 0澹伴亾L 1澹伴亾R | 0澹伴亾L 1澹癛閬?/td> | |
| 16浣嶅崟澹伴亾 | 0澹伴亾(浣庡瓧鑺? 0澹伴亾(楂樺瓧鑺? | 0澹伴亾(浣庡瓧鑺? 0澹伴亾(楂樺瓧鑺? | |
| 16浣嶇珛浣撳0 |
0澹伴亾(浣庡瓧鑺?0澹伴亾錛堥珮瀛楄妭錛?澹伴亾(浣? 1澹伴亾(楂? |
鍚屽乏 |
---------
waveform-audio 緙撳瓨鏍煎紡銆
typedef struct {
LPSTR lpData; //鍐呭瓨鎸囬拡錛屾斁緗煶棰憄cm鏍鋒湰鏁版嵁
DWORD dwBufferLength; //闀垮害
DWORD dwBytesRecorded; //宸插綍闊崇殑瀛楄妭闀垮害
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops; //寰幆嬈℃暟
struct wavehdr_tag* lpNext; //淇濈暀
DWORD reserved; //淇濈暀
} WAVEHDR;
鍏朵腑lpdata 鍗充負pcm鏍煎紡鏍鋒湰鏁版嵁銆?br>
閲囨牱澶у皬涓?浣嶏紝鍒欓噰鏍風殑鍔ㄦ佽寖鍥翠負20*log(256)鍒嗚礉=48db銆?br>鏍鋒湰澶у皬涓?6浣嶏紝鍒欓噰鏍峰姩鎬佽寖鍥翠負20*log(65536)澶х害鏄?6鍒嗚礉
鎸箙澶у皬錛?#160; 20*log(A1/A2)鍒嗚礉錛孉1,A2涓轟袱涓0闊崇殑鎸箙銆?br>鍒欏浜庣殑闊抽錛?br> 8浣?#160; 20 * lg( lpData[0] /256)
16浣?#160; 20 * lg( lpData[0]--lpData[1] / 65536)
鑰冭檻鍒板崟鍙岄亾錛岃繕闇瑕佺浉搴斿彇鍑哄乏鍙沖0閬撶殑鍊箋?br> 鑰冭檻鍒發g姹傚間負璐?8鑷?涔嬮棿錛屽垯鍦ㄥ疄闄呰漿鎹腑闇瑕?48or96.
鏍鋒湰澶у皬 鏁版嵁鏍煎紡 鏈澶у?#160; 鏈灝忓?
8浣峆CM unsigned int 256 0
16浣峆CM int 32767 -32767
8浣嶉煶棰戞槸unsigned 瀛樻斁娉㈠艦,鍙栨尟騫呰-127.
鑰?6浣嶅洜鍏跺瓨鏀句負int 綾誨瀷,鐩存帴濂楃敤鍏紡.
audiometer宸﹀彸澹伴亾闊抽噺鎺㈡祴紼嬪簭錛?a href="http://m.shnenglu.com/Files/kenlistian/audioVu_di.rar">鍙傝冧唬鐮?delphi鐗?/a>錛?/p>
2 DiectDound鍑犱釜瀵硅薄
鍒涘緩涓涓澶囧璞★紝鍚庨氳繃璁懼瀵硅薄鍒涘緩緙撳啿鍖哄璞°?br> 杈呭姪緙撳啿鍖虹敱搴旂敤紼嬪簭鍒涘緩鍜岀鐞嗭紝DirectSound浼氳嚜鍔ㄥ湴鍒涘緩鍜岀鐞嗕富緙撳啿鍖猴紝
3 鎾斁闊抽鏂囦歡寮鍙戠殑鍩烘湰嫻佺▼
銆a 鍒涘緩涓涓澶囧璞★紝璁劇疆璁懼瀵硅薄鐨勫崗浣滃害銆?
銆銆 璋冪敤DirectSoundCreat8鍒涘緩涓涓敮鎸両DirectSound8鎺ュ彛鐨勫璞★紝
榪欎釜瀵硅薄閫氬父浠h〃緙虹渷鐨勬挱鏀捐澶囥?br> 銆
銆濡傛灉娌℃湁澹伴煶杈撳嚭璁懼錛岃繖涓嚱鏁板氨榪斿洖error錛屾垨鑰咃紝鍦╒XD椹卞姩紼嬪簭涓嬶紝
濡傛灉澹伴煶杈撳嚭璁懼姝h鏌愪釜搴旂敤紼嬪簭閫氳繃waveform鏍煎紡鐨刟pi鍑芥暟鎵鎺у埗錛?br> 璇ュ嚱鏁頒篃榪斿洖error銆?nbsp;
LPDIRECTSOUND8 lpDirectSound;
HRESULT hr = DirectSoundCreate8(NULL,&lpDirectSound, NULL)); 褰撳垱寤哄畬璁懼瀵硅薄鍚庯紝璋冪敤IDirectSound8::SetCooperativeLevel鏉ヨ緗?br> 鍗忎綔搴︼紝鍚﹀垯鍚笉鍒板0闊?
b.鍒涘緩涓涓緟鍔〣uffer錛屼篃鍙悗澶囩紦鍐插尯
(IDirectSound8::CreateSoundBuffer)
鍒涘緩鐨刡uffer縐頒綔杈呭姪緙撳啿鍖猴紝Direcsound閫氳繃鎶婂嚑涓悗澶囩紦鍐插尯鐨勫0闊?br> 娣峰悎鍒頒富緙撳啿鍖轟腑錛岀劧鍚庤緭鍑哄埌澹伴煶杈撳嚭璁懼涓婏紝杈懼埌娣烽煶鐨勬晥鏋溿?/p>
c. 鑾峰彇PCM綾誨瀷鐨勬暟鎹?br>
銆銆灝哤AV鏂囦歡鎴栬呭叾浠栬祫婧愮殑鏁版嵁璇誨彇鍒扮紦鍐插尯涓?/p>
d. 灝嗘暟鎹鍙栧埌緙撳啿鍖?br> 鍏朵腑鐢ㄥ埌浠ヤ笅鏉ラ攣緙撳啿鍖恒?br> IDirectSoundBuffer8::Lock
IDirectSoundBuffer8::Unlock.
e. 鎾斁緙撳啿鍖轟腑鐨勬暟鎹?br> IDirectSoundBuffer8::Play 鎾斁緙撳啿鍖轟腑鐨勯煶棰戞暟鎹紝
IDirectSoundBuffer8::Stop 鏆傚仠鎾斁鏁版嵁錛?br>
鑾峰彇鎴栬呰緗鍦ㄦ挱鏀劇殑闊抽鐨勯煶閲忕殑澶у皬
銆 銆IDirectSoundBuffer8::GetVolume
IDirectSoundBuffer8::SetVolume
鑾峰彇璁劇疆闊抽鎾斁鐨勯鐜?br>銆 銆IDirectSoundBuffer8::GetFrequency
IDirectSoundBuffer8::SetFrequency
涓葷紦鍐插尯鐨勯鐜囦笉鍏佽鏀瑰姩錛?/p>
璁劇疆闊抽鍦ㄥ乏鍙沖0閬撴挱鏀劇殑浣嶇疆
IDirectSoundBuffer8::GetPan
IDirectSoundBuffer8::SetPan
銆銆鍖呭惈鍏ㄩ儴闊抽鏁版嵁鐨勭紦鍐插尯鎴戜滑縐頒負闈欐佺殑緙撳啿鍖猴紝
灝界涓嶅悓鐨勫0闊沖彲鑳戒細鍙嶅浣跨敤鍚屼竴涓唴瀛榖uffer錛屼絾闈欐佺紦鍐插尯鐨勬暟鎹彧鍐欏叆涓嬈°?/p>
闈欐佺紦鍐插尯鍙~鍏呬竴嬈℃暟鎹紝鐒跺悗灝卞彲浠lay錛?br>
銆緇欓潤鎬佺紦鍐插尯鍔犺澆鏁版嵁鍒嗕笅闈㈠嚑涓楠?br>銆銆1銆佺敤IDirectSoundBuffer8::Lock鍑芥暟鏉ラ攣瀹氭墍鏈夌殑鍐呭瓨錛?br> 鎸囧畾浣犻攣瀹氬唴瀛樹腑浣犲紑濮嬪啓鍏ユ暟鎹殑鍋忕Щ浣嶇疆錛屽茍涓斿彇鍥炶鍋忕Щ浣嶇疆鐨勫湴鍧銆?br>銆銆2銆侀噰鐢ㄦ爣鍑嗙殑鏁版嵁copy鏂規硶錛屽皢闊抽鏁版嵁澶嶅埗鍒拌繑鍥炵殑鍦板潃銆?br>銆銆3銆佽皟鐢↖DirectSoundBuffer8::Unlock.錛岃В閿佽鍦板潃銆?/p>
鐢╯tatic buffer 鎾斁wav鏂規硶
LPDIRECTSOUNDBUFFER8 g_pDSBuffer8 = NULL; //buffer
LPDIRECTSOUND8 g_pDsd = NULL; //dsound
CWaveFile *g_pWaveFile= NULL;
//鍒濆鍖朌irectSound宸ヤ綔
HRESULT hr;
if(FAILED(hr = DirectSoundCreate8(NULL,&g_pDsd,NULL)))
銆return FALSE;
//璁劇疆璁懼鐨勫崗浣滃害
if(FAILED(hr = g_pDsd->SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY)))
銆return FALSE;
g_pWaveFile = new CWaveFile;
g_pWaveFile->Open(_T("c:\\test.wav"), NULL, WAVEFILE_READ);
DSBUFFERDESC dsbd;
ZeroMemory( &dsbd, sizeof(DSBUFFERDESC) );
dsbd.dwSize = sizeof(DSBUFFERDESC);
dsbd.dwFlags = DSBCAPS_GLOBALFOCUS //璁劇疆涓繪挱
| DSBCAPS_CTRLFX
| DSBCAPS_CTRLPOSITIONNOTIFY
| DSBCAPS_GETCURRENTPOSITION2;
dsbd.dwBufferBytes = g_pWaveFile->GetSize();
dsbd.lpwfxFormat = g_pWaveFile->m_pwfx;
LPDIRECTSOUNDBUFFER lPBuffer;
//鍒涘緩杈呭姪緙撳啿鍖哄璞?/span>
if(FAILED(hr = g_pDsd->CreateSoundBuffer(&dsbd,&lpbuffer,NULL)))
銆return ;
if( FAILED(hr = lpbuffer->QueryInterface( IID_IDirectSoundBuffer8, (LPVOID*) &g_pDSBuffer8) ) )
銆return ;
lpbuffer->Release();
//鎾斁
LPVOID lplockbuf;
DWORD len;
DWORD dwWrite;
g_pDSBuffer8->Lock(0,0, &lplockbuf, &len, NULL, NULL, DSBLOCK_ENTIREBUFFER);
//g_pWaveFile 澹伴煶鍐欏叆鍒發plockbuf鎵鎸囧湴鍧
g_pWaveFile->Read((BYTE*)lplockbuf, len, &dwWrite);
g_pDSBuffer8->Unlock(lplockbuf,len,NULL,0);
g_pDSBuffer8->SetCurrentPosition(0);
g_pDSBuffer8->Play(0,0,DSBPLAY_LOOPING);
f 嫻佺紦鍐插尯鎾斁瓚呭ぇ鍨嬬殑wave鏂囦歡
銆嫻佺紦鍐插尯灝辨槸鎾斁閭d簺姣旇緝闀跨殑闊抽鏂囦歡,杈規挱鏀撅紝杈瑰~鍏匘irectSound緙撳啿鍖恒?/p>
DirectSound鐨勯氱煡鏈哄埗
鍥犱負Stream buffer 澶у皬鍙瀹圭撼涓閮ㄥ垎鏁版嵁錛屽湪鎾斁瀹岀紦鍐插尯涓殑鏁版嵁鍚庯紝
DirectSound灝變細閫氱煡搴旂敤紼嬪簭錛屽皢鏂扮殑鏁版嵁濉厖鍒癉irectSound鐨勭紦鍐插尯涓?/p>
褰揇irectSound鎾斁鍒癰uffer鐨?920錛?840錛?760錛?680絳変綅緗椂錛?br>Directsound灝變細閫氱煡搴旂敤紼嬪簭錛屽皢g_event,璁劇疆涓洪氱煡鎬?
搴旂敤紼嬪簭灝遍氳繃WaitForMultipleObjects 鍑芥暟絳夊緟DirectSound鐨勯氱煡錛?br>灝嗘暟鎹~鍏呭埌DirectSoun鐨勮緟鍔╃紦鍐插尯銆?/p>
int iDev = 0;
for (int i = 0; i < 10 ; i++)
{
//榪欓噷鍙互鍒ゆ柇鏈夊嚑璺榫欏崱
hr = CoCreateInstance(CLSID_RM_MPEG2_VIDEO_SUBPICTURE, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *) &pDecoderFilter);
if(hr != S_OK)
break;
iDev++;
}
char sMsg[256];
sprintf(sMsg,"%d", iDev);
MessageBox(ghApp, sMsg, "Msg", MB_OK);銆緋葷粺璁懼鏋氫婦鍣ㄦ槸鏍規嵁涓嶅悓鐨勭綾繪潵鍒涘緩鐨勶紝濡傦紝闊抽鍘嬬緝錛岃棰戞崟鎹夈?br> 涓嶅悓縐嶇被鐨勬灇涓懼櫒瀵逛簬姣忎竴縐嶈澶囪繑鍥炰竴涓嫭绔嬬殑鍚嶇О錛坢oniker錛夈?/p>
涓嬮潰鐨勬楠ゆ槸浣跨敤璁懼鏋氫婦鍣ㄦ潵鑾峰彇璁懼錛?/p>
1) 鍒涘緩鏋氫婦鍣ㄧ粍浠訛紝CLSID涓篊LSID_SystemDeviceEnum
2) 鎸囧畾鏌愪竴縐嶇被鍨嬭澶囷紝鑾峰彇璇ョ綾繪灇涓懼櫒
閫氳繃ICreateDevEnum::CreateClassEnumerator鑾峰彇鏌愪竴縐嶇被鐨勬灇涓懼櫒錛?br> 璇ュ嚱鏁拌繑鍥炰竴涓狪EnumMoniker鎺ュ彛鎸囬拡錛?br> 閫氳繃媯鏌ヨ繑鍥炲兼槸鍚︿負S_OK鏉ュ垽鏂槸鍚﹁幏鍙栧埌璇ョ綾繪灇涓懼櫒.
3) 鐢↖EnumMoniker::Next鏋氫婦姣忎竴涓猰oniker銆?br> 榪欎釜鏂規硶榪斿洖涓涓狪Moniker鎺ュ彛鎸囬拡銆?br>4) 閫氳繃IMoniker::BindToStorage鑾峰彇璁懼鐨勫悕縐?/p>
澶ц嚧渚嬪瓙濡備笅錛?br>
HRESULT hr;
ICreateDevEnum *pSysDevEnum = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pSysDevEnum);
if (FAILED(hr))銆return hr;
//鑾峰彇video compressor 縐嶇被鏋氫婦鍣?nbsp;
IEnumMoniker *pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat,0);
if (hr == S_OK)
{
銆IMoniker *pMoniker = NULL;
銆ULONG cFetched;

銆while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
銆銆IPropertyBag *pPropBag;
銆銆hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
銆銆if (SUCCEEDED(hr))
銆銆
{
銆銆銆// 鑾峰彇璁懼鍚嶇О
銆銆銆VARIANT varName;
銆銆銆VariantInit(&varName);
銆銆銆hr = pPropBag->Read(L"FriendlyName", &varName, 0);
銆銆銆if (SUCCEEDED(hr))
{銆銆銆
//鑾峰彇璁懼鍚嶇О
銆銆銆}
銆銆銆VariantClear(&varName);
銆銆}
銆銆pMoniker->Release();
銆}
銆pEnumCat->Release();
}
pSysDevEnum->Release();

2.閲囩敤Filer Mapper銆?br> 綾諱技鏉′歡鏌ヨ銆?br>
姣旂郴緇熻澶囨灇涓懼櫒錛圫ystem Device Enumerator錛夌殑鏁堢巼瑕佷綆涓浜涖?br> 褰撹鏋氫婦鏌愮壒瀹氱綾葷殑filter鏃訛紝搴旈噰鐢ㄧ郴緇熻澶囨灇涓懼櫒鏂規硶錛屼絾鎼滅儲鏀寔鏌愮
濯掍綋綾誨瀷鐨刦ilter鏃訛紝鐢╢ilter mapper.
Filter Mapper 閫氳繃IFilerMapper2鎺ュ彛鎼滅儲鎺ュ彛錛?br> 閫氳繃璋冪敤IFilterMapper2::EnumMatchingFilters鏂規硶錛屼紶閫掍竴浜涘弬鏁版潵瀹氫箟鎼滅儲鏉′歡錛?br> 榪斿洖涓涓傚悎鏉′歡鐨刦ilter鐨勬灇涓懼櫒錛?br>
榪斿洖鐨勬槸涓涓狪EnumMoniker鎺ュ彛錛屽茍瀵逛簬姣忎釜閫傚悎鐨刦ilter閮芥彁渚涗竴涓崟鐙殑moniker銆?/p>
渚嬪瓙錛?br>
//鏋氫婦鎵鏈夌殑鏀寔DV錛屽茍涓旇嚦灝戞湁涓涓緭鍑簆in鐨刦ilter錛?br>
//榪欎釜filter鏀寔浠諱綍濯掍綋綾誨瀷銆?/span>
IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;
hr =CoCreateInstance( CLSID_FilterMapper2,NULL, CLSCTX_INPROC, IID_IFilterMapper2, (void **) &pMapper);
if (FAILED(hr))
{ }
GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;
hr = pMapper->EnumMatchingFilters(
銆 &pEnum,
0, // Reserved.
銆TRUE, // Use exact match?
銆MERIT_DO_NOT_USE+1, // Minimum merit.
銆TRUE, // At least one input pin?
銆1, // Number of major type/subtype pairs for input.
arrayInTypes, // Array of major type/subtype pairs for input.
NULL, // Input medium.
NULL, // Input pin category.
FALSE, // Must be a renderer?
TRUE, // At least one output pin?
0, // Number of major type/subtype pairs for output.
NULL, // Array of major type/subtype pairs for output.
銆NULL, // Output medium.
NULL); // Output pin category.
IMoniker *pMoniker;
ULONG cFetched; 
//鏋氫婦filter錛?/span>
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)

{
銆IPropertyBag *pPropBag = NULL;
銆hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
銆if (SUCCEEDED(hr))
銆
{
VARIANT varName;
銆銆VariantInit(&varName);
銆 銆hr = pPropBag->Read(L"FriendlyName", &varName, 0);
銆銆 if (SUCCEEDED(hr))
銆銆
{
//澶勭悊
銆銆 }
銆 銆VariantClear(&varName);
銆}
銆pMoniker->Release();
}
pMapper->Release();
pEnum->Release();
DirectShow鍔犲叆涓涓‖浠禙ilter錛屾槸闈?#8220;鏋氫婦”錛涘0鍗ilter涔熶笉渚嬪銆?br>浠h〃澹板崱鐨凢ilter閮芥敞鍐屽湪CLSID_AudioInputDeviceCategory鐩綍涓嬶紝
浣跨敤緋葷粺璁懼鏋氫婦鍣ㄦ灇涓捐繖涓洰褰曪紝灝辮兘鍙戠幇瑕佸垱寤虹殑澹板崱瀵硅薄銆?br> 錛堝浣曟灇涓捐繖閲屽氨涓嶅啀璧樿堪浜嗐?
褰撴垚鍔熷姞鍏ュ0鍗ilter鍚庯紝鎺ヤ笅鍘葷殑闂灝辨槸瑕佸皢榪欎釜Filter涓庡叾浠朏ilter鐩歌繛銆?/p>
鎯蟲崟鎹夌敓鎴愪竴涓猈ave鏂囦歡錛岄噰鐢ㄨ繃婊ゅ櫒鐨勫嬀榪炲涓?br> 澹板崱filter--->Wave Dest Filter ---->File Writer Filter
Wave Dest Filter鏄井杞疍irectX SDK鑷甫鐨勮繃婊ゅ櫒
鍏跺姛鑳芥槸錛屽綋緇撴潫鎹曟崏鏃訛紝寰Wave鏂囦歡涓啓鍏ヤ竴涓枃浠跺ご淇℃伅銆?br>
Filte Write Filter 鏄井杞郴緇熻繃婊ゅ櫒銆?br>鐢╣raphedit鍙互鍕捐繛鍚庢祴璇曚笅銆?/p>
//閲囩敤紼嬪簭鏉ヨ繛鎺ヨ繃婊ゅ櫒鐨勫ぇ鑷存柟娉?
//娌℃湁澶勭悊閿欒
void BuildAudioCaptureGraph(void)
{
銆IBaseFilter *pSrc = NULL, //鎹曟崏闊抽璁懼
*pWaveDest = NULL, //澶勭悊闊抽榪囨護鍣?br> *pWriter = NULL; //浜х敓鏂囦歡榪囨護鍣?/p>
銆IFileSinkFilter *pSink= NULL;
銆IGraphBuilder *pGraph;
銆// Create the Filter Graph Manager.
銆CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
銆// Add the audio capture filter.
//榪欓噷鐪佺暐浜嗘灇涓捐澶囧鐞?br> 銆FindAudioCapture(&pSrc);
銆// audio capture devices and picks one.
銆pGraph->AddFilter(pSrc, L"Capture");
銆// Add the WavDest and the File Writer.
銆AddFilterByClsid(pGraph, L"WavDest", CLSID_WavDest, &pWavDest);
銆AddFilterByClsid(pGraph, L"File Writer", CLSID_FileWriter, &pWriter);
銆//鏄痺riter鎺ュ彛涓睘鎬?br> 銆pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
銆pSink->SetFileName(L"C:\test.wav", NULL);
銆//榪炴帴filter
銆ConnectTwoFilters(pGraph, pSrc, pWavDest);
銆ConnectTwoFilters(pGraph, pWavDest, pWriter);
}
DirectShow鍔熻兘瀹炵幇錛?/p>
1.鍙彁渚涢珮璐ㄩ噺鐨勫濯掍綋嫻佺殑鎹曡幏鍜屽洖鏀懼姛鑳斤紱
2.鏀寔澶氱濯掍綋鏍煎紡錛屽寘鎷珹SF錛圓dvanced Systems Format錛夛紝MPEG錛圡otion Picture Experts Group錛夛紝AVI錛圓udio-Video Interleaved錛夛紝MP3錛圡PEG Audio Layer-3錛夊拰WAV澹伴煶鏂囦歡錛?br>3.鍙粠紜歡涓婃崟鑾峰獟浣撴暟鎹祦錛?br>4.鍙嚜鍔ㄦ嫻嬪茍浣跨敤瑙嗛鍜岄煶棰戝姞閫熺‖浠躲?/p>
鏁咃紝DirectShow鏄敤浜庡濯掍綋搴旂敤寮鍙戙?鍏跺疄灝辨槸涓涓蔣緙栫爜(or瑙g爜))
瀹冨厖鍒嗗彂鎸ュ獟浣撶殑鎬ц兘錛屾彁楂樿繍琛岄熷害錛屽彲浠ョ畝鍖栧獟浣撴挱鏀俱佸獟浣撻棿鐨勬牸寮忚漿鎹?br>鍜屽獟浣撴崟鑾風瓑宸ヤ綔銆傚悓鏃訛紝瀹冭繕鍏鋒湁鏋佸ぇ鐨勫彲鎵╁睍鎬у拰鐏墊椿鎬э紝鍙互鐢辯敤鎴瘋嚜宸?br>鍒涘緩緇勪歡錛屽茍灝嗚繖涓粍浠跺姞鍏irectShow緇撴瀯涓互鏀寔鏂扮殑鏍煎紡鎴栫壒孌婄殑鏁堟灉銆?/p>
搴旂敤紼嬪簭涓嶥irectShow緇勪歡浠ュ強DirectShow鎵鏀寔鐨勮蔣紜歡涔嬮棿鐨勫叧緋?br>濡傚浘1
浜屻傛蹇?br>1.榪囨護鍣?br>榪囨護鍣ㄥ垎涓轟互涓嬪嚑縐嶇被鍨嬶細
a 婧愯繃婊ゅ櫒錛坰ource filter錛夛細
婧愯繃婊ゅ櫒寮曞叆鏁版嵁鍒拌繃婊ゅ櫒鍥捐〃涓紝鏁版嵁鏉ユ簮鍙互鏄枃浠躲佺綉緇溿佺収鐩告満絳夈?br> 涓嶅悓鐨勬簮榪囨護鍣ㄥ鐞嗕笉鍚岀被鍨嬬殑鏁版嵁婧愩?/p>
b 鍙樻崲榪囨護鍣紙transform filter錛夛細
鍙樻崲榪囨護鍣ㄧ殑宸ヤ綔鏄幏鍙栬緭鍏ユ祦錛屽鐞嗘暟鎹紝騫剁敓鎴愯緭鍑烘祦銆?br> 鍙樻崲榪囨護鍣ㄥ鏁版嵁鐨勫鐞嗗寘鎷紪瑙g爜銆佹牸寮忚漿鎹€佸帇緙╄В鍘嬬緝絳夈?/p>
c 鎻愪氦榪囨護鍣紙renderer filter錛夛細
鎺ユ敹鏁版嵁騫舵妸鏁版嵁鎻愪氦緇欏璁俱?/p>
d 鍒嗗壊榪囨護鍣紙splitter filter錛夛細
鎶婅緭鍏ユ祦鍒嗗壊鎴愬涓緭鍑恒?br> 濡傦紝AVI鍒嗗壊榪囨護鍣ㄦ妸涓涓狝VI鏍煎紡鐨勫瓧鑺傛祦鍒嗗壊鎴愯棰戞祦鍜岄煶棰戞祦銆?/p>
e 娣峰悎榪囨護鍣紙mux filter錛夛細
鎶婂涓緭鍏ョ粍鍚堟垚涓涓崟鐙殑鏁版嵁嫻併?br> 濡傦紝AVI娣峰悎榪囨護鍣ㄦ妸瑙嗛嫻佸拰闊抽嫻佸悎鎴愪竴涓狝VI鏍煎紡鐨勫瓧鑺傛祦銆?br> 銆榪囨護鍣ㄧ殑榪欎簺鍒嗙被騫朵笉鏄粷瀵圭殑錛屽涓涓狝SF璇昏繃婊ゅ櫒錛圓SF Reader filter錛?br> 鏃㈡槸涓涓簮榪囨護鍣ㄥ張鏄竴涓垎鍓茶繃婊ゅ櫒銆?br>
2 filter graph
榪囨護鍣ㄥ浘琛ㄧ敤鏉ヨ繛鎺ヨ繃婊ゅ櫒浠ユ帶鍒跺獟浣撴祦錛屽畠涔熷彲浠ュ皢鏁版嵁榪斿洖緇欏簲鐢ㄧ▼搴忥紝
騫舵悳绱㈡墍鏀寔鐨勮繃婊ゅ櫒銆?br> 榪囨護鍣ㄦ湁涓夌鍙兘鐨勭姸鎬侊細榪愯銆佸仠姝㈠拰鏆傚仠銆?br> 鏆傚仠鏄竴縐嶄腑闂寸姸鎬侊紝鍋滄鐘舵佸埌榪愯鐘舵佸繀瀹氱粡榪囨殏鍋滅姸鎬併?br> 鏆傚仠鍙互鐞嗚В涓烘暟鎹氨緇姸鎬侊紝鏄負浜嗗揩閫熷垏鎹㈠埌榪愯鐘舵佽岃璁$殑銆?nbsp;
鍦ㄦ殏鍋滅姸鎬佷笅錛屾暟鎹嚎紼嬫槸鍚姩鐨勶紝浣嗚鎻愪氦榪囨護鍣ㄩ樆濉炰簡銆?br>
閫氬父鎯呭喌涓嬶紝榪囨護鍣ㄥ浘琛ㄤ腑鎵鏈夎繃婊ゅ櫒鐨勭姸鎬佹槸涓鑷寸殑銆?br>
3. 寮曡剼錛坧in錛?br>銆榪囨護鍣ㄥ彲浠ュ拰涓涓垨澶氫釜榪囨護鍣ㄧ浉榪烇紝
榪炴帴鐨勬帴鍙d篃鏄疌OM褰㈠紡鐨勶紝縐頒負寮曡剼銆?br>
榪囨護鍣ㄥ埄鐢ㄥ紩鑴氬湪鍚勪釜榪囨護鍣ㄩ棿浼犺緭鏁版嵁銆?br> 姣忎釜寮曡剼閮戒粠Ipin榪欎釜COM瀵硅薄媧劇敓鍑烘潵鐨勩?br> 姣忎釜寮曡剼閮芥槸榪囨護鍣ㄧ殑縐佹湁瀵硅薄錛岃繃婊ゅ櫒鍙互鍔ㄦ佺殑鍒涘緩寮曡剼錛岄攢姣佸紩鑴氾紝鑷敱鎺у埗寮曡剼鐨勭敓瀛樻椂闂淬?br> 寮曡剼鍒嗚緭鍏ュ紩鑴氾紙Input pin錛夊拰杈撳嚭寮曡剼錛圤utput pin錛変袱縐嶇被鍨嬶紝
涓や釜鐩歌繛鐨勫紩鑴氬繀欏繪槸涓嶅悓縐嶇被鐨勶紝鍗寵緭鍏ュ紩鑴氬彧鑳藉拰杈撳嚭寮曡剼鐩歌繛
銆榪囨護鍣ㄤ箣闂寸殑榪炴帴錛堜篃灝辨槸寮曡剼涔嬮棿鐨勮繛鎺ワ級錛屽疄闄呬笂鏄繛鎺ュ弻鏂瑰獟浣撶被鍨嬶紙Media Type錛夊崗鍟嗙殑榪囩▼銆傦紙濯掍綋綾誨瀷錛屼笉瀹屽叏濯掍綋綾誨瀷 鍐嶄笅涓鑺傛湁璁茶В)
榪炴帴鐨勫ぇ鑷磋繃紼嬩負錛?br> 濡傛灉璋冪敤榪炴帴鍑芥暟鏃跺凡緇忔寚瀹氫簡瀹屾暣鐨勫獟浣撶被鍨嬶紝鍒欑敤榪欎釜濯掍綋綾誨瀷榪涜榪炴帴錛?br> 鎴愬姛涓庡惁閮界粨鏉熻繛鎺ヨ繃紼嬶紱
濡傛灉娌℃湁鎸囧畾鎴栦笉瀹屽叏鎸囧畾浜嗗獟浣撶被鍨嬶紝
鍒欐灇涓捐繃紼嬭鍚庨潰.鍏朵袱涓猣ilter鐨勮繛鎺ヨ瀹氬涓?
Filter A ------------------> Filter B
------------------------------------------------------------- ------------------
璇存槑:
濯掍綋綾誨瀷錛圡edia Type錛?br> 涓や釜榪囨護鍣ㄧ浉榪炴椂錛屽繀欏諱嬌鐢ㄤ竴鑷寸殑濯掍綋綾誨瀷錛屽惁鍒欒繖涓や釜榪囨護鍣ㄥ氨涓嶈兘鐩歌繛銆?br>
濯掍綋綾誨瀷鑳借瘑鍒笂涓綰ц繃婊ゅ櫒浼犻佺粰涓嬩竴綰ц繃婊ゅ櫒鐨勬暟鎹被鍨嬶紝騫跺鏁版嵁榪涜鍒嗙被銆?br> 濯掍綋綾誨瀷鐨勭粨鏋?nbsp; AM_MEDIA_TYPE
AM_MEDIA_TYPE鐢變笁閮ㄥ垎緇勬垚錛?br> Major type
Subtype
Format type
閮戒嬌鐢℅UID 鏉ュ敮涓鏍囩ず
Major type涓昏瀹氭ф弿榪頒竴縐嶅獟浣撶被鍨嬶紝榪欑濯掍綋綾誨瀷鍙互鏄棰戙侀煶棰戙佹瘮鐗規暟鎹祦鎴朚IDI鏁版嵁絳夛紱
Subtype 榪涗竴姝ョ粏鍖栧獟浣撶被鍨嬶紝
鎷胯棰戠殑璇村氨鏄繘涓姝ユ寚瀹氭槸RGB-24錛岃繕鏄疪GB-32錛屾垨鏄疷YVY絳夛紱
Format type鍒欑敤涓涓粨鏋勬洿榪涗竴姝ョ粏鍖栧獟浣撶被鍨嬨?/p>
銆濯掍綋綾誨瀷鐨勪笁涓儴鍒嗛兘鎸囧畾浜嗘煇涓叿浣撶殑GUID鍊鹼紝鍒欑О榪欎釜濯掍綋綾誨瀷鏄畬鍏ㄦ寚瀹氱殑錛?br> 濯掍綋綾誨瀷鐨勪笁涓儴鍒嗕腑鏈変換浣曚竴涓兼槸GUID_NULL錛屽垯縐拌繖涓獟浣撶被鍨嬫槸涓嶅畬鍏ㄦ寚瀹氱殑銆?br> GUID_NULL璧烽氶厤絎︿綔鐢?br>
pinout鍜宲inin鐨勮繛鎺ヨ繃紼嬪彲浠ョ敤涓嬮潰閫昏緫璇█琛ㄨ揪.
1.濡傝皟鐢ㄨ繛鎺ュ嚱鏁版椂宸茬粡鎸囧畾浜嗗畬鏁寸殑Media type錛屽垯鐢ㄨ繖涓狹edia type榪涜榪炴帴錛?br>鎴愬姛涓庡惁閮界粨鏉熻繛鎺ヨ繃紼嬶紱
2.濡傛病鏈夋寚瀹氭垨涓嶅畬鍏ㄦ寚瀹氫簡Media type錛?br>鍒欏涓?
BOOL CheckFilterB_PinIn()
{
for(i = 0 ; i < FilterB.FPinIn.MediaTypeCount ; i++)
{
if (IsSameMediaType(FilterA.FPinOut,FilterB.FPinIn.MediaType[i]) = True)
{
return TRUE; //Pin涔嬮棿鐨勮繛鎺ユ垚鍔燂紱
}
}
return FALSE; //鍦↖nput pin涓嶆敮鎸佽濯掍綋綾誨瀷,澶辮觸.
}
榪斿洖FALSE鍐嶆灇涓綩utput pin涓婄殑鎵鏈塎edia type錛屽茍閫愪竴鐢ㄨ繖浜汳edia type涓嶪nput pin榪涜榪炴帴銆?br>
for(i = 0 ; i < FilterA.FPinOut.MediaTypeCount; i++)
{
if (CheckFilteB_PinIn(FilterA.FPinOut.MediaType[i]) = True )
{
return TRUE;
}
}
return FALSE; //filterA鍜宖ilterB鐨勮繛鎺ュけ璐?
Filter蹇呴』鍔犲叆鍒癋ilter Graph騫舵帴鍏ュ埌宸ヤ綔閾捐礬涓墠鑳藉彂鎸ヤ綔鐢ㄣ?br>濡傛兂緇曡繃Filter Graph鑰岀洿鎺ヤ嬌鐢‵ilter瀹炵幇鐨勫姛鑳芥ā鍧楋紝閭e氨瑕佸皢Filter鍔熻兘
縐繪鎴怐irectX濯掍綋瀵硅薄錛圖MO錛夈?br>Filter鏈?縐嶇姸鎬侊細鍋滄銆佹殏鍋滃拰榪愯銆?/p>
Filter Chain鏄浉浜掕繛鎺ョ潃鐨勪竴鏉ilter閾捐礬錛屽茍涓旈摼璺腑鐨勬瘡涓狥ilter鍏ㄩ兘鏈変竴涓浜?#8220;宸茶繛鎺?#8221;鐘舵佺殑
杈撳叆Pin錛岃嚦澶氭湁涓涓浜?#8220;宸茶繛鎺?#8221;鐘舵佺殑杈撳嚭Pin錛岃繖鏉ilter閾捐礬涓殑鏁版嵁嫻佷笉渚濊禆閾捐礬澶栫殑鍏朵粬Filter銆?/p>
Filter Chain閫氳繃IFilterChain鎺ュ彛鏉ヨ繘琛岀浉鍏蟲搷浣溿?br>褰揊ilter Graph澶勪簬榪愯鐘舵佷笅錛孎ilter Chain鍙互鍦ㄨ繍琛屽拰鍋滄鐘舵佷箣闂村垏鎹紱
褰揊ilter Graph澶勪簬鏆傚仠鐘舵佷笅錛孎ilter Chain鍙互鍦ㄦ殏鍋滃拰鍋滄鐘舵佷箣闂村垏鎹€?br>Filter Chain鍙湁涓ょ鐘舵佽漿鎹€?/p>
Filter鐨勬暟鎹紶閫?br>Filter涔嬮棿浠ample鐨勫艦寮忎紶閫佹暟鎹?br>Sample鏄竴涓皝瑁呬簡涓瀹氬ぇ灝忔暟鎹唴瀛樼殑COM緇勪歡銆?br>鐢ㄤ簬鏁版嵁浼犺緭鐨勪竴鑸槸杈撳叆pin涓婂疄鐜扮殑IMemInputPin鎺ュ彛銆?/p>