DirectShow 鎻愪緵浜?jiǎn)濡備笅杩囨护鍣ㄦ潵鏄窘C鴻棰戯細(xì)
l Video Renderer 榪囨護(hù)鍣?font face="Times New Roman">. 璇ヨ繃婊ゅ櫒鍙敤浜庢墍鏈夌殑鏀寔DirectX鐨勫鉤鍙幫紝瀹冨騫沖彴娌℃湁鍏跺畠鐗規(guī)畩鐨勮姹傘傚彲浠ユ槸瀹冿紝鎴?font face="Times New Roman">GDI鏉ユ樉紺鴻棰戙傚畠鏄湪WindowsXP涔嬪墠鎿嶄綔緋葷粺鐨勯粯璁よ棰戞樉紺鴻繃婊ゅ櫒銆?/font>
l Video Mixing Renderer Filter 7 (VMR-7). VMR-7鍙敤浜?font face="Times New Roman">WindowsXP鎿嶄綔緋葷粺錛屽茍涓旀槸璇ョ郴緇熶笅鐨勯粯璁よ棰戞樉紺鴻繃婊ゅ櫒銆備笌鑰佺殑瑙嗛鏄劇ず榪囨護(hù)鍣ㄧ浉姣旓紝瀹冨叿鏈変竴浜涙洿寮哄ぇ鐨勬ц兘錛屽寘鎷噰鐢ㄦ彃浠舵ā寮忔潵鎺у埗DirectShow鏄劇ず銆?/font>
l Video Mixing Renderer Filter 9 (VMR-9). VMR-9鏄竴涓洿鏂扮殑瑙嗛娣峰悎鏄劇ず榪囨護(hù)鍣紝瀹冮噰鐢ㄤ簡(jiǎn)Direct3D鏉ユ樉紺恒傚畠鍙敤浜庢墍鏈夌殑鏀寔DirectX鐨勫鉤鍙般傚畠涓嶆槸榛樿鐨勬樉紺鴻繃婊ゅ櫒錛屽洜涓哄畠涓庡叾瀹冪殑鏄劇ず榪囨護(hù)鍣ㄧ浉姣旓紝瀵圭郴緇熻姹傛洿楂樸?/font>
涓鑸潵璇達(dá)紝鍦ㄨ棰戞樉紺哄簲鐢ㄤ笂錛?font face="Times New Roman">VMR-9鏄閫夈傚洜涓猴紝瀹冧嬌鐢ㄤ簡(jiǎn)鏈鏂扮殑鍥懼儚API錛屽茍涓旀彁渚涗簡(jiǎn)鏈濂界殑鎬ц兘銆?/font>
紿椾綋妯″紡鍜岄潪紿椾綋妯″紡
DirectShow瑙嗛鏄劇ず鍙互閫夋嫨鍦ㄧ獥浣撴ā寮忔垨鑰呴潪紿椾綋妯″紡涓嬭繘琛屻?/font>
l 鍦ㄧ獥浣撴ā寮忎笅錛岃棰戝皢鍒涘緩涓涓畠鑷繁鐨勭獥浣撴潵鏄劇ず銆?/font>
l 鍦ㄩ潪紿椾綋妯″紡涓嬶紝瑙嗛鍙互鑷繁鍦ㄤ綘紼嬪簭鐨勪竴涓獥鍙d笂鏄劇ず錛岃屼笉璁╄棰戣嚜宸卞尯鍒涘緩紿椾綋鏉ユ樉紺恒?/font>
Video Renderer榪囨護(hù)鍣ㄥ彧鏀寔紿椾綋妯″紡錛?font face="Times New Roman">VMR-7鍜?font face="Times New Roman">VMR-9鏀寔榪欎袱縐嶆ā寮忋傚畠浠粯璁ょ姸鎬佹槸紿椾綋妯″紡銆?/font>
鍦ㄧ獥浣撴ā寮忎笅錛岃棰戝皢鍒涘緩涓涓獥鍙o紝鐒跺悗鍦ㄨ紿楀彛涓婃樉紺鴻棰戙傚ぇ澶氭暟鎯呭喌涓嬶紝浣犲彲鑳芥兂瑕佹妸璇ョ獥鍙g粦瀹氬埌浣犵殑搴旂敤紼嬪簭涓傞氳繃浣跨敤IVideoWindow鎺ュ彛錛屽彲浠ヨ緗棰戠獥鍙g殑綾誨瀷鍜屼綅緗?/font>
鍦ㄥ紑濮嬫挱鏀懼墠錛屽湪榪囨護(hù)鍣ㄥ浘琛ㄧ鐞嗗櫒涓幓鏌ユ壘IVideoWindow鎺ュ彛錛?/font>
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
璋冪敤IVideoWindow::put_Owner鏂規(guī)硶鍘誨鐞嗕綘搴旂敤紼嬪簭鐨勭獥浣撱傝鏂規(guī)硶鎻愪緵浜?jiǎn)涓涓?strong>OAHWND綾誨瀷鐨勫彉閲忥紝鎵浠ヨ鎶婂彞鏌勮漿鎹負(fù)璇ョ被鍨嬶細(xì)
pVidWin->put_Owner((OAHWND)hwnd);
璋冪敤IVideoWindow::Put_WindowStyle鏉ユ敼鍙樿棰戠獥浣撶殑綾誨瀷錛?/font>
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
WS_CHILD鏍囧織璁劇疆瑙嗛紿椾綋涓轟竴涓瓙紿椾綋錛?font face="Times New Roman">WS_CLIPSIBLINGS鏍囧織鍙互闃叉瑙嗛紿椾綋鍦ㄥ彟涓涓瓙紿椾綋鐨勫鎴峰尯鍐呮樉紺鴻棰戙?/font>
璋冪敤IVideoWindow::SetWindowPosition鏂規(guī)硶鍙互瑙嗛紿楀彛鐨勭浉瀵逛簬浣犲簲鐢ㄧ▼搴忕殑瀹㈡埛鍖虹殑浣嶇疆銆傝鏂規(guī)硶鐨勫弬鏁板甫浜?jiǎn)涓涓?font face="Times New Roman">RECT鍙傛暟錛岀敤瀹冨幓鎸囧畾瑙嗛紿楀彛鐨勪綅緗備笅渚嬶紝璁╄棰戠獥鍙e拰瀹冪埗紿椾綋鐨勫鎴峰尯鎯沖尮閰嶃?/font>
RECT grc;
GetClientRect(hwnd, &grc);
pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
閫氳繃鍦ㄨ繃婊ゅ櫒鍥捐〃綆$悊鍣ㄤ笂璋冪敤IBaseicVide:GetVideoSize鏂規(guī)硶鍙互寰楀埌瑙嗛鏈韓鐨勫昂瀵稿ぇ灝忋備綘鍙互閫氳繃榪欎簺淇℃伅璁╄棰戜繚鎸佹紜殑綰墊í姣斾緥銆?
鍦ㄥ簲鐢ㄧ▼搴忛鍑哄墠錛屽仠姝㈠浘琛ㄥ茍閲嶇疆瑙嗛紿楀彛涓?font face="Times New Roman">NULL銆傚惁鍒欙紝紿楀彛娑堟伅鍙兘琚敊璇殑鍙戦佺粰閿欒鐨勭獥鍙o紝浠庤屽鑷撮敊璇彂鐢燂紝
pControl->Stop();
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);
瑙嗛娣峰悎鏄劇ず榪囨護(hù)鍣紙VMR-7鍜?font face="Times New Roman"> VMR-9錛夐兘鏀寔闈炵獥浣撴ā寮忋傝繖閲屽皢鎻忚堪紿椾綋妯″紡鍜岄潪紿椾綋妯″紡涔嬮棿鐨勪笉鍚岋紝浠ュ強(qiáng)濡備綍浣跨敤闈炴ā寮忕獥浣撱?
涓轟簡(jiǎn)鍚戝悗鍏煎宸茬粡鍦ㄤ嬌鐢ㄧ殑搴旂敤紼嬪簭錛?font face="Times New Roman">VMR榛樿鐨勬樉紺烘ā寮忎負(fù)紿椾綋妯″紡銆傚湪紿椾綋妯″紡涓紝瑙嗛鍒涘緩涓涓畠鑷繁鐨勭獥浣撳幓鏄劇ず瑙嗛銆傚簲鐢ㄧ▼搴忚緗繖涓棰戠獥浣撲負(fù)瀹冪殑涓涓瓙紿椾綋銆傝繖涓崟鐙?a title=PPS褰辮鐧劇-瀛樺湪 target=_blank>瀛樺湪鐨勭獥浣撲細(xì)瀵艱嚧濡備笅闂錛?
l 鏈涓ラ噸鐨勬槸錛?a title=PPS褰辮鐧劇-濡傛灉 target=_blank>濡傛灉紿椾綋鐨勬秷鎭湪綰跨▼闂村彂閫佸彲鑳藉鑷存秷鎭閿併?font face="Times New Roman">
l 榪囨護(hù)鍣ㄥ浘琛ㄧ鐞嗗櫒蹇呴』浼犻掓煇浜?font face="Times New Roman">window娑堟伅錛屾瘮濡?font face="Times New Roman">WM_PAINT錛岀粰瑙嗛鏄劇ず鍣?font face="Times New Roman">(Video Renderer)銆傝繖浜涘IvideoWIndow鐨勬搷浣滃繀欏繪槸鐢辮繃婊ゅ櫒鍥捐〃綆$悊鍣ㄦ潵瀹屾垚錛岃屼笉鏄棰戞樉紺哄櫒鏉ュ畬鎴愶紝鎵浠ヨ闈犺繃婊ゅ櫒鍥捐〃綆$悊鍣ㄦ潵綰犳鍐呴儴鐘舵併?/font>
l 瑕佽棰戠獥浣撶殑榧犳爣鎴栬呴敭鐩樹簨浠訛紝搴旂敤紼嬪簭蹇呴』寤虹珛涓涓?#8220;娑堟伅閫氶亾”錛岃瑙嗛紿楀彛鎶婃秷鎭紶閫掔粰搴旂敤紼嬪簭銆?font face="Times New Roman">
l 涓轟簡(jiǎn)闃叉鍓帴鐨勬儏鍐碉紝瑙嗛紿椾綋榪樺繀欏繪嫢鏈夋紜殑紿楀彛鐘舵併?font face="Times New Roman">
闈炵獥浣撴ā寮忛氳繃浣跨敤VMR鐩存帴鍦ㄥ簲鐢ㄧ▼搴忕殑瀹㈡埛鍖轟笂鐢誨浘鏉ラ伩鍏嶄簡(jiǎn)涓婅堪鐨勯棶棰樸傚畠浣跨敤DirectDraw鍘誨壀鎺ヨ棰戠煩褰€傞潪紿椾綋妯″紡鏋佸ぇ紼嬪害鍑忓皯浜?jiǎn)姝婚攣鐨?a title=PPS褰辮鐧劇-鍋剁劧 target=_blank>鍋剁劧鍙戠敓銆傚悓鏍鳳紝搴旂敤紼嬪簭涓嶅繀鍘昏緗棰戣嚜韜垱寤虹殑紿楀彛鍜岀獥鍙g殑鐘舵併備簨瀹炰笂錛屽綋VRM浣跨敤紿椾綋妯″紡鏃訛紝瀹冧篃涓嶄嬌鐢?strong>IVideoWindow鎺ュ彛銆?/font>
瑕佷嬌鐢ㄩ潪紿椾綋妯″紡錛屼綘蹇呴』鏄庣‘鍦板幓閰嶇疆VMR銆備綘浼?xì)鍙戠幇閰嵕|伐浣滈潪甯哥伒媧誨茍涓旀瘮紿椾綋妯″紡鏇村鏄撱?/font>
鍦ㄩ厤緗?font face="Times New Roman">VMR 鍓嶅簲寤虹珛榪囨護(hù)鍣ㄥ浘琛?font face="Times New Roman">(Filter graph):
鐜板湪璋冪敤IGraphBuilder::RenderFile瀹屾垚榪囨護(hù)鍣ㄥ浘琛ㄤ綑涓嬬殑宸ヤ綔銆傝繃婊ゅ櫒鍥捐〃綆$悊鍣ㄥ皢鑷姩浣跨敤榪欎釜浣犳坊鍔犲埌榪囨護(hù)鍣ㄥ浘琛ㄤ腑鐨?font face="Times New Roman">VMR瀹炰緥銆?/font>
涓嬮潰浠g爜鏄劇ず浜?jiǎn)杩欎簺宸ヤ綔锛?xì)
HRESULT InitWindowlessVMR(
HWND hwndApp, // 瑙嗛紿椾綋
IGraphBuilder* pGraph, // 榪囨護(hù)鍣ㄥ浘琛ㄦ寚閽?font face="Times New Roman">
IVMRWindowlessControl** ppWc, // 鎺ユ敹VMR鎸囬拡
)
{
if (!pGraph || !ppWc) return E_POINTER;
IBaseFilter* pVmr = NULL;
IVMRWindowlessControl* pWc = NULL;
// 鍒涘緩VMR
HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer, NULL,
CLSCTX_INPROC, IID_IBaseFilter, (void**)&pVmr);
if (FAILED(hr))
{
return hr;
}
// 鎶?font face="Times New Roman">VMR娣誨姞鍒拌繃婊ゅ櫒鍥捐〃涓?
hr = pGraph->AddFilter(pVmr, L"Video Mixing Renderer");
if (FAILED(hr))
{
pVmr->Release();
return hr;
}
// 璁劇疆鏄劇ず妯″紡
IVMRFilterConfig* pConfig;
hr = pVmr->QueryInterface(IID_IVMRFilterConfig, (void**)&pConfig);
if (SUCCEEDED(hr))
{
hr = pConfig->SetRenderingMode(VMRMode_Windowless);
pConfig->Release();
}
if (SUCCEEDED(hr))
{
// 璁劇疆紿椾綋
hr = pVmr->QueryInterface(IID_IVMRWindowlessControl, (void**)&pWc);
if( SUCCEEDED(hr))
{
hr = pWc->SetVideoClippingWindow(hwndApp);
if (SUCCEEDED(hr))
{
*ppWc = pWc; //榪斿洖AddRef鎸囬拡
}
else
{
pWc->Release();
}
}
}
pVmr->Release();
return hr;
}
璇ュ嚱鏁板亣璁炬鍦ㄦ樉紺轟竴涓棰戞祦騫舵病鏈夋販鍚堢殑闈?rùn)鎬佷綅鍥俱備綘灝嗙湅鍒版寜濡備笅璋冪敤璇ュ嚱鏁幫細(xì)
IVMRWindowlessControl *pWc = NULL;
hr = InitWindowlessVMR(hwnd, pGraph, &g_pWc);
if (SUCCEEDED(hr))
{
// 寤虹珛鍥捐〃
pGraph->RenderFile(wszMyFileName, 0);
//瀹屾垚鍚庨噴鏀?font face="Times New Roman">VMR鎺ュ彛
pWc->Release();
}
瑙嗛瀹氫綅
閰嶇疆瀹?font face="Times New Roman">VMR鍚庯紝涓嬩竴涓楠ゅ氨鏄幓璁劇疆瑙嗛鏄劇ず鐨勪綅緗傛湁涓や釜鐭╁艦浣嶇疆瑕佽冭檻錛屼竴涓槸Source鐭╁艦浣嶇疆錛屼竴涓槸desitnation鐭╁艦浣嶇疆銆?font face="Times New Roman">Source瀹氫箟瑙嗛鏄劇ず鐨勪綅緗?font face="Times New Roman">Destination鎸囧畾鍖呭惈瑙嗛鐨勭獥浣撶殑瀹㈡埛鍖虹殑浣嶇疆銆?font face="Times New Roman">VMR浠?font face="Times New Roman">source鎶婂浘鍍忔寜destination鐨勫昂瀵稿尮閰嶅悗鏄劇ず鍑烘潵銆?/font>
璋冪敤IVMRWindowlessControl::SetVideoPosition鍘繪寚瀹氳繖涓袱涓煩褰綅緗?font face="Times New Roman">Source鐭╁艦鐨勫ぇ灝忓繀欏葷瓑浜庢垨灝忎簬瑙嗛鏈韓鐨勫昂瀵稿ぇ灝忥紱浣犲彲浠ヤ嬌鐢?strong>IVMRWindowlessControl::GetNativeVideoSize鍘昏幏寰楄棰戞湰韜殑灝哄銆?/font>
涓嬮潰鐨勫疄渚嬶紝灝嗚緗?font face="Times New Roman">Source絳変簬瑙嗛灝哄1/4錛堝乏涓婅鐨勪綅緗浉絳夛級(jí)錛屽茍璁劇疆destination鐭╁艦絳変簬紿椾綋瀹㈡埛鍖虹殑澶у皬1/錛堝乏涓婅鐨勪綅緗浉絳夛級(jí)錛?/font>
// 鑾峰緱瑙嗛鑷韓灝哄澶у皬
long lWidth, lHeight;
HRESULT hr = g_pWc->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL);
if (SUCCEEDED(hr))
{
RECT rcSrc, rcDest;
// 璁劇疆Source灝哄
SetRect(&rcSrc, 0, 0, lWidth/2, lHeight/2);
// 鑾峰緱鏄劇ず紿椾綋鐨勫鎴峰尯灝哄
GetClientRect(hwnd, &rcDest);
//璁劇疆destination灝哄
SetRect(&rcDest, 0, 0, rcDest.right/2, rcDest.bottom/2);
// 瑙嗛瀹氫綅
hr = g_pWc->SetVideoPosition(&rcSrc, &rcDest);
}
澶勭悊紿椾綋娑堟伅
鍥犱負(fù)VMR娌℃湁鑷繁鐨勭獥浣擄紝褰撹棰戦渶瑕侀噸鐢繪垨鑰呭昂瀵歌鏀瑰彉鏄紝浣犲繀欏昏閫氱煡紿椾綋鏉ラ傚簲銆?/font>
l 褰撴帴鏀跺埌涓涓?font face="Times New Roman">WM_PAINT娑堟伅錛屽彲璋冪敤IVMRWindowlessControl::RepaintVideo 鏉ラ噸鐢誨浘鍍忋?font face="Times New Roman">
l 褰撴帴鏀跺埌涓涓?font face="Times New Roman">WM_DISPLAYCHANGE 娑堟伅, 鍙皟鐢?font face="Times New Roman"> IVMRWindowlessControl::DisplayModeChanged娑堟伅銆?font face="Times New Roman">VMR灝卞彲浠ヨ幏寰楀涓嬭涓烘瘮濡傛敼鍙樺垎杈ㄧ巼鎴栬呰壊娣便?font face="Times New Roman">
l 褰撴帴鏀跺埌涓涓?font face="Times New Roman">WM_SIZE 娑堟伅, 鍙互閲嶆柊璋冪敤SetVideoPosition 鏉ユ敼鍙樿棰戠殑鏄劇ず浣嶇疆銆?font face="Times New Roman">
涓嬮潰鏄劇ず濡備綍澶勭悊WM_PAINT娑堟伅銆傚畠?yōu)畣鍦ńH椾綋鐨勫鎴峰尯閲嶇粯錛屼絾鏄笉浼?xì)瀵硅棰戞槃·虹殑鍖哄煙杩涜閲嵕l樸備笉瀵硅棰戞樉紺虹殑鍖哄煙榪涜閲嶇粯錛屾槸鍥犱負(fù)VMR浼?xì)瀵硅鍖哄煙鏄窘C鴻棰戯紝濡傛灉浣犵殑紼嬪簭鍐嶅璇ュ尯鍩熼噸緇樹細(xì)寮曡搗灞忓箷闂儊銆備篃鏄簲涓鴻繖涓師鍥狅紝鎵鏈変笉瑕佸湪浣犵獥浣撶被涓幓璁劇疆鑳屾櫙鍒楓?/font>
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rcClient;
GetClientRect(hwnd, &rcClient);
hdc = BeginPaint(hwnd, &ps);
if (g_pWc != NULL)
{
// 鏌ユ壘紿椾綋闇瑕侀噸緇樼殑瀹㈡埛鍖猴紝璇ュ尯鍩熷簲璇ュ噺鍘昏棰戞樉紺虹殑鍖哄煙
// (榪欓噷鍋囪g_rcDest 鏄凡緇忚綆楀ソ浜?jiǎn)鐨勫尯鍩?font face="Times New Roman">)
HRGN rgnClient = CreateRectRgnIndirect(&rcClient);
HRGN rgnVideo = CreateRectRgnIndirect(&g_rcDest);
CombineRgn(rgnClient, rgnClient, rgnVideo, RGN_DIFF);
// 閲嶇粯紿椾綋
HBRUSH hbr = GetSysColorBrush(COLOR_BTNFACE);
FillRgn(hdc, rgnClient, hbr);
// 閲婃斁瀵硅薄
DeleteObject(hbr);
DeleteObject(rgnClient);
DeleteObject(rgnVideo);
// 璇鋒眰VMR to 閲嶇粯瑙嗛
HRESULT hr = g_pWc->RepaintVideo(hwnd, hdc);
}
else // 娌℃湁瑙嗛鏄劇ず錛岄噸緇樻暣涓鎴峰尯
{
FillRect(hdc, &rc2, (HBRUSH)(COLOR_BTNFACE + 1));
}
EndPaint(hwnd, &ps);
}
1.鎺ュ彛涓嶅啀浣跨敤XXXXX2/4/7,鑰屾槸浣跨敤緇熶竴鐨?/span>XXXXX, 濡?/span>:
LPDIRECTDRAW g_pDD = NULL;(鏂?/span>)
LPDIRECTDRAW4 g_pDD = NULL;(鏃?/span>)
鏂扮増鏈?/span>涓嶅吋瀹規(guī)棫鐗堟湰.
2.鍦ㄥ垵濮嬪寲LPDIRECTDRAW g_pDD鐨勬椂鍊欎笉鍐嶉渶瑕?/span>QueryInterface,鑰屾槸鐩存帴鐢?/span> DirectDrawCreate(NULL, &g_pDD, NULL);瀹屾垚.
3.DDCAPS緇撴瀯鏀瑰彉,寰堝鎴愬憳涓嶅啀浣跨敤ddcaps.dwCaps&DDSCAP_XXX鍒ゆ柇鏄惁鏈夎繖涓姛鑳?/span>.鑰屾槸鏍規(guī)嵁鐩存帴鎻愪緵鐨?/span>ddcaps.dwXXXCpas鐨勬垚鍛樻槸鍚︿負(fù)0鏉ュ垽鏂?/span>.榪樻湁寰堝鐨勬垚鍛樼殑鏀瑰彉錛岃繖涓湅鏂扮殑PB6.0鐨勬枃妗c?/span>
4. DDSURFACEDESC ddsd鏀瑰姩(鍙浜?/span>Overlay)
涓嶅啀浣跨敤 ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY;
涓殑DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY;
5.Overlay鐨?/span>Alpha璁劇疆闂:
瑕丱verlay鏈夐忔槑鏁堟灉鍙璁劇疆DDOVERLAYFX 涓殑 dwAlphaConst,dwAlphaConstBitDepth鍒板悎閫傜殑鍊煎氨鍙互浜?br>