锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
OPAL鏄疧pen Phone Abstraction Library錛屾槸Openh323鐨勪笅涓涓増鏈紝瀹冧粛鐒朵嬌鐢ㄤ簡Openh323鐨勪綋緋葷粨鏋勶紝騫跺湪鍏跺熀紜涓婅繘琛屾墿灞曪紝鍚屾椂瀹炵幇浜哠IP,H.323錛屼絾鍦ㄩ煶棰戝拰瑙嗛鐨勭紪鐮佸拰浼犺緭閮ㄥ垎鏈夎緝澶ф敼鍔ㄣ侽PAL鍒濊》璁捐鏄寘鍚換浣曠數璇濋氫俊鍗忚錛屾墍浠ュ叾搴曞眰榪涜浜嗛珮搴︾殑鎶借薄鍖栵紝鎵浠ヤ篃鑳藉寰堝鏄撶殑鏀寔MGCP,PSTN鍜屽皢鏉ヤ細鍑虹幇鐨勫崗璁備笉榪囩敱浜嶰penh323鐨勬渶鍚庝竴涓増鏈繕鍦ㄥ紑鍙戜腑錛屾墍浠ュ師鏈?鏈堝彂甯冪殑OPAL涔熻鎺ㄨ繜錛岀幇鏈夌殑OPAL榪橀潪甯鎬笉瀹屽杽錛孊UG涔熼潪甯稿錛屼笉榪囩浉淇′互Openh323鐨勫紑鍙戠彮搴曪紝涓瀹氳兘璁㎡PAL鍗佸垎浼樼銆?
CVS : :pserver:anonymous@cvs.sourceforge.net:/cvsroot/openh323/opal
Language : C++
VxWorks port : Yes
Win32 port : Yes
Linux port : Yes
Supports RFC 3261 : Yes
Supports RFC 2327 : Yes
Supports RFC 3264 : Yes
Supports RFC 3263 : No
Supports RFC 3515 : Yes
Supports RFC 3262 : No
Supports RFC 3311 : No
TCP : Yes
UDP : Yes
SIZE : 8MB
License : MPL
Document : None
Samples : UA,GK
VOCAL鏄痸ovida.org寮鍙戠殑SIP緋葷粺錛孷OCAL搴旇鏄洰鍓嶅姛鑳芥渶瀹屽杽錛屼嬌鐢ㄨ呮渶澶氱殑寮婧怱IP鍗忚鏍堜簡.瀹冧笉鍙寘鎷簡鍗忚鏍堬紝榪樺寘鎷簡h323涓巗ip杞崲緗戝叧錛屽SIP鐨勫悇縐峉erver鐨勫姛鑳芥敮鎸佷篃闈炲父瀹屽杽.涓嶈繃寰堝彲鎯滐紝涓嶆敮鎸亀indows騫沖彴錛岃屼笖鑷粠vovida琚獵ISCO鏀惰喘浠ュ悗灝卞仠姝簡寮鍙戯紝鏈鍚庣殑鐗堟湰鏄?003騫?鏈堢殑1.5.0銆?
CVS : :pserver:anonymous@cvs.vovida.org:/cvsroot/vocal
Language : C++
VxWorks port : No
Win32 port : Partial
Linux port : Yes
Supports RFC 3261 : Partial
Supports RFC 2327 : Yes
Supports RFC 3264 :
Supports RFC 3263 :
Supports RFC 3515 : Yes
Supports RFC 3262 :
Supports RFC 3311 :
TCP : Yes
UDP : Yes
SIZE : 6MB
License: Vovida software licencse
Document : Few
Samples : UA,GK,GW
sipX鏄竴涓猄IP緋葷粺錛岀敱SIPFoundry寮鍙戙俿ipX鏄粠reSIProcate鍒嗙鍑烘潵鐨勶紝sipX闄や簡鍖呮嫭SIP stack澶栵紝榪樺寘鎷簡sipXphone,sipXproxy,sipXregistry絳夌瓑...,鐢卞畠浠瀯鎴愪簡瀹屾暣鐨凷IP緋葷粺錛岃屼笖sipx榪樻敮鎸佸祵鍏ュ紡緋葷粺錛屽悇涓ā鍧楀彲浠ユ寜闇鍙栬垗銆備笉榪囧彲鎯滄槸鍑犱箮娌℃湁浠諱綍寮鍙戞枃妗c?
SVN : http://scm.sipfoundry.org/viewsvn/
Language : C++
VxWorks port : Yes
Win32 port : Yes
Linux port : Yes
Supports RFC 3261 : Yes
Supports RFC 2327 : Yes
Supports RFC 3264 : Yes
Supports RFC 3263 : Yes
Supports RFC 3515 : Yes
Supports RFC 3262 : No
Supports RFC 3311 : No
TCP : Yes
UDP : Yes
SIZE : <4 Mb
License : LGPL
Document : None
Samples : UA,GK,GW
ReSIProcate鍚屾牱涔熸槸鐢盨IPFoundry寮鍙戯紝ReSIProcate鏈寮濮嬭搗婧愪簬Vocal,鐢變簬Vocal寮濮嬪彧鏀寔rfc3254錛屼負浜嗘敮鎸佹渶鏂扮殑rfc3261,ReSIProcate璇炵敓浜嗭紝浣嗙幇鍦紝ReSIProcate宸茬粡鎴愪負涓涓嫭绔婼IP鍗忚鏍堜簡錛屽畠鍗佸垎紼沖畾錛屽茍涓斿緢澶氬晢涓氱▼搴忛兘鍦ㄤ嬌鐢ㄣ?
SVN : http://scm.sipfoundry.org/viewsvn/resiprocate/main/sip/
Language : C++
VxWorks port : No
Win32 port : Yes
Linux port : Yes
Supports RFC 3261 : Yes
Supports RFC 2327 : Yes
Supports RFC 3264 : Yes
Supports RFC 3263 : Partial
Supports RFC 3515 : Yes
Supports RFC 3262 : No
Supports RFC 3311 : No
TCP : Yes
UDP : Yes
SIZE : < 2.5 Mb
License : Vovida
Document : Few
Samples : None
oSIP鐨勫紑鍙戝紑濮嬩簬2000騫?鏈堬紝絎竴涓増鏈湪2001騫?鏈堝彂甯冿紝鍒扮幇鍦ㄥ凡緇忓彂灞曞埌2.0.9浜嗐傚畠閲囩敤ANSI C緙栧啓錛岃屼笖緇撴瀯綆鍗曞皬宸э紝鎵浠ラ熷害鐗瑰埆蹇紝瀹冨茍涓嶆彁渚涢珮灞傜殑SIP浼氳瘽鎺у埗API,瀹冧富瑕佹彁渚涗竴浜涜В鏋怱IP/SDP娑堟伅鐨凙PI鍜屼簨鍔″鐞嗙殑鐘舵佹満錛宱SIP鐨勪綔鑰呰繕寮鍙戜簡鍩轟簬oSIP鐨刄A lib:exosip鍜宲roxy server lib:partysip.
CVS : :ext:anoncvs@savannah.gnu.org:/cvsroot/osip
Language : C
VxWorks port : Yes
Win32 port : Yes
Linux port : Yes
Supports RFC 3261 : Yes
Supports RFC 2327 : Yes
Supports RFC 3264 : Yes
Supports RFC 3263 : Yes
Supports RFC 3515 : No
Supports RFC 3262 : No
Supports RFC 3311 : Yes
TCP : Yes
UDP : Yes
SIZE : 400kb
License : LGPL
Samples : UA,GK
緇煎悎涓婅堪璇勬祴錛屽彲浠ョ湅鍑?縐峉IP鍗忚鏍堝悇鏈夊崈縐嬶紝OPAL鏈夊彂灞曟綔鍔涳紝VOCAL姣旇緝瀹屽杽錛宻ipX鍏煎鎬уソ錛孯eSIProcate鏁欑ǔ瀹氾紝oSIP灝忓閥鑰屽揩閫熴傛墍浠ヨ鏍規嵁搴旂敤鐨勪笉鍚岄夋嫨鎭板綋鐨勫崗璁爤榪涜鐮旂┒寮鍙戙?/p>
鍥? 鍙戦佺鐨凢ilter Graph
鎺ユ敹绔殑瀹炵幇鎬濊礬濡備笅:閫氳繃涓涓帴鏀禙ilter鎺ユ敹鍙戦佺鍙戦佺殑鏁版嵁錛岀劧鍚庡啀鐢―ivx Decoder Filter瀵規帴鏀跺埌鐨勬暟鎹繘琛岃В鐮併傛渶鍚庣敤Video Renderer鎶婅В鐮佸悗鐨勬暟鎹挱鏀懼嚭鏉ャ傚叾Filter Graph濡傚浘2鎵紺猴細
鍥? 鎺ユ敹绔殑Filter Graph
3.1 鏁版嵁閲囬泦鍙婄紪鐮佺殑瀹炵幇
3.1.1 閲囬泦Filter Graph鐨勫疄鐜?/strong>
閲囬泦搴旂敤鐨凢ilter Graph涓鑸瘮杈冨鏉傦紝鑰岀洿鎺ヤ嬌鐢‵ilter Graph Manager涓婄殑IGraphBuilder鎺ュ彛鏋勫緩榪欑Filter Graph,鏈夋椂鍊欓毦搴﹀張寰堝ぇ銆備負姝わ紝DirectShow鐗瑰埆鎻愪緵浜嗕竴涓緟鍔╃粍浠禖apture Graph Builder,鏉ョ畝鍖栬繖縐岶ilter Graph鐨勫垱寤恒?br> 棣栧厛鏄垱寤篎ilter Graph Manager 緇勪歡錛屾牳蹇冧唬鐮佸涓嬶細
3.1.2 鍔犲叆閲囬泦Filter 鍥? 緗戠粶鍙戦佹帴鏀剁▼搴忔祦紼嬪浘 4 鎬葷粨 璇ョ郴緇熼噰鐢ㄤ簡DirectShow鎶鏈疄鐜頒簡MPEG-4瑙嗛鏁版嵁鐨勪紶杈擄紝瑙嗛鏁版嵁鐨勪紶杈撻噰鐢ㄤ簡RTP鍗忚銆傝屼笖榪樺疄鐜頒簡榪滅甯х巼鐨勬帶鍒訛紝璇ョ郴緇熷彲浠ュ緢鏂?渚跨殑縐繪鍒版湭鏉?G緗戠粶鐨勫浘鍍忎紶杈撶郴緇熶腑銆傚緙栬В鐮佸櫒榪涜鐮旂┒錛岄噰鐢℉.264鎶鏈疄鐜扮紪瑙g爜Filter鏄笅涓姝ヨ瀹屾垚鐨勫伐浣滐紝褰撶劧鍦ㄤ紶杈撹川閲?錛圦oS錛夋柟闈篃瑕佹繁鍏ヨ繘琛岀爺絀躲?/p>
鍙傝冩枃鐚?/strong>
3.1.3鍔犲叆MPEG-4緙栫爜鍣‵ilter
榪欓噷鎴戜滑閲囩敤Divx 鎻愪緵鐨勫紑婧愮紪鐮丗ilter銆傚畨瑁匘ivX.Pro.v5.1.1鍚庝細鑷姩瀹夎Divx鐨勭紪鐮佸櫒Filter鍜岃В鐮佸櫒Filter錛堟敞錛氳В鐮佸櫒 Filter鍦ㄦ帴鏀剁瑕佺敤鍒幫級銆傚湪紼嬪簭涓姞鍏ivx鐨勭紪鐮佸櫒Filter錛屽疄鐜版濇兂鏄湪Video Compressors鐩綍涓嬫灇涓懼埌鍚嶇О涓?DivX Pro(tm) 5.1.1 Codec"鐨凢ilter欏瑰悗錛屾妸瀹冨姞鍏ュ埌Filter Graph涓嵆鍙?br>3.2 鏁版嵁鐨勫彂閫佸拰鎺ユ敹
3.2.1 鏁版嵁鐨勫彂閫丗ilter鐨勫疄鐜?/strong>
鏁版嵁鐨勫彂閫佽寮鍙戜竴涓彂閫丗ilter錛屼負浜嗙紪紼嬩笂鐨勬柟渚匡紝榪欓噷閲囩敤紼嬪簭鍐匜ilter鐨勫艦寮忔潵瀹炵幇銆傚嵆鐢ㄧ被鐨勫艦寮忚屼笉鏄紪鍐欎竴涓垚涓涓悗緙涓篴x鐨勭粍浠?娉ㄥ唽鍚庡啀浣跨敤銆傝繖閲屾垜浠畾涔変竴涓戶鎵胯嚜CBaseFilter鐨勭被CFilterMpeg4Sender銆傝繖涓被蹇呴』瀹炵幇浠ヤ笅鍔熻兘[3]錛?br> (1) 鍦ㄧ被涓畾涔塁FilterMpeg4Sender涓婄殑Pin鐨勫疄渚媘InputPin銆?br> (2) 瀹炵幇緇ф壙鑷狢BaseFilter::GetPin,鐢ㄤ簬榪斿洖Filter涓婂悇涓狿in鐨勫璞℃寚閽堛?br> (3) 瀹炵幇緇ф壙鑷狢BaseFilter::GetPin,鐢ㄤ簬榪斿洖Filter涓婂悇涓狿in鐨勬暟閲忋?br> 瀹氫箟涓涓戶鎵胯嚜CRenderedInputPin鐨勭被CMpeg4InputPin錛岀敤浜庡疄鐜癈FilterMpeg4Sender涓婄殑杈撳叆pin錛屽彂閫丗ilter閫氳繃璇ヨ緭鍏in鎺ユ敹緙栫爜Filter杈撳嚭鐨勬暟鎹紝鐒跺悗鎸変竴瀹氱殑瑙勫垯鍙戦併?br> 榪欎釜綾誨繀欏誨疄鐜頒互涓嬪姛鑳絒2]錛?br> (1) 閲嶅啓鏂規硶EndOfStream銆?br> (2) 瀹炵幇IPin::BeginFlush鍜孖Pin::EndFlush涓や釜鍑芥暟銆?br> (3) 閲嶅啓鏂規硶CBasePin::CheckMediaType榪涜榪炴帴鏃跺獟浣撶被鍨嬬殑媯鏌ャ?br> (4) 閲嶅啓鏂規硶CBasePin:: Receive(),鎺ユ敹Sample騫跺彂閫?br>3.2.2 鏁版嵁鐨勬帴鏀禙ilter鐨勫疄鐜?
鏁?鎹殑鎺ユ敹鍏跺疄鏄緙栧啓涓涓猄ource Filter, 榪欎釜Source Filter鍚嶇О涓篊FilterMpeg4Receiver錛屼篃緇ф壙鑷狢BaseFilter銆傝繖璺熷彂閫丗ilter鐨勫疄鐜版湁浜涚被浼鹼紝鏈変竴鐐歸渶瑕佹敞鎰忕殑 鏄Filter杈撳嚭鐨凪ediaType鐨勮緗?br> Char MediaType[]=//濯掍綋鏁版嵁綾誨瀷,閫氳繃鍦ㄥ彂閫佺鎶婂獟浣撶被鍨嬪啓鍒頒竴涓枃浠朵腑鑰屽緱鍒扮劧鍚庨氳繃璇彞錛欳FilterMpeg4Receiver:: SetupMediaType((char *)MediaType,88)璁劇疆杈撳嚭鏁版嵁鐨凪ediaType銆?br> CFilterMpeg4Receiver::SetupMediaType鍐嶈皟鐢–Mpeg4OutPin::SetupMediaType錛堬級璁劇疆銆佹帴鏀跺埌鐨勫獟浣撴暟鎹殑鏍煎紡錛?br>3.2.3 鏁版嵁鐨勭綉緇滀紶杈撶殑瀹炵幇
鏁版嵁鐨勫彂閫佹垜浠噰鐢ㄥ紑婧愪唬鐮丣RTPLIB銆?銆戞彁渚涚殑RTP鍗忚鏍堛傛渶鏂扮殑JRTPLIB瀵筊FC3550鐨勫疄鐜拌繘琛屼簡灝佽錛屽紑鍙戜漢鍛樺彧瑕佸垵姝ヤ簡瑙?RTP鍗忚灝卞彲浠ュ紑鍙戝嚭楂樿川閲忕殑闊寵棰戜紶杈撶▼搴忋備嬌鐢↗RTPLIB鏃訛紝鍙渶瑕侀氳繃緇ф壙RTPSession綾伙紝鍐嶉噸鏂頒互涓嬪嚑涓嚱鏁板氨鍙互瀹炵幇瑙嗛鏁版嵁鐨?鎺ユ敹銆?/p>
鍦ㄧ綉緇滃甫瀹芥瘮杈冧綆鐨勬儏鍐典笅錛堝鍗佸嚑KBps錛夛紝鏁版嵁涓㈠撫鐜拌薄姣旇緝涓ラ噸錛岃繖瀵逛簬鍥懼儚璐ㄩ噺鏈夊緢澶х殑褰卞搷銆傛垜浠噰鐢ㄦ媶甯э紙鎷嗘垚1400涓瓧鑺傦級浠ュ悗鍐嶅彂閫佺殑鏂規硶錛屾潵闄嶄綆涓㈠撫鐜囥傛帴鏀剁鏀跺埌鏁版嵁鍚庯紝鍐嶆妸灞炰簬鍚屼竴瑙嗛甯х殑鏁版嵁鍐嶇粍璧鋒潵銆?br> 緗戠粶鍙戦佹帴鏀剁▼搴忔祦紼嬪浘濡傚浘3鎵紺猴細
瀵圭▼搴忔祦紼嬪浘鐨勮鏄庡涓嬶細
錛?錛夊彂閫佺鎷嗗撫鐨勭畻娉曞涓嬶細
鐒跺悗鎶婂睘浜庡悓涓瑙嗛甯х殑鏁版嵁緇勫ソ錛屽彂閫佸埌瑙g爜Filter銆?br> 緇忚繃嫻嬭瘯錛堝湪CDMA1.X緗戠粶涓嬶級錛岄噰鐢ㄦ媶甯ф柟娉曚紶杈撹棰戞暟鎹瘮鐩存帴鍙戦佷涪鍖呯巼鏇翠綆錛屼紶杈撹川閲忔湁浜嗗緢澶х殑鎻愰珮銆?br>3.3 鏁版嵁瑙g爜鍙婂洖鏀劇殑瀹炵幇
瑙g爜Filter浣跨敤鐨勬槸Divx鎻愪緵鐨勫紑婧愯В鐮佸櫒錛屽湪鎺ユ敹Filter鐨勫悗闈㈡帴涓婅瑙g爜Filter鍗沖彲錛屾渶鍚庢帴涓奟enderer Filter灝卞彲浠ユ妸鎺ユ敹鍒扮殑鏁版嵁鍥炴斁鍑烘潵銆?br>3.4 瀹炵幇甯х巼鎺у埗鍔熻兘
閫氳繃鍦ㄩ噰闆嗚澶囧拰緙栫爜Filter錛圖ivX Pro(tm) 5.1.1 Codec錛変箣闂村姞鍏ヤ竴涓撫鐜囨帶鍒禙ilter鏉ュ疄鐜板撫鐜囩殑鎺у埗錛岃Filter鐩稿綋浜庝竴涓棰戝撫鏁拌鏁板櫒錛屾瘡鎺ユ敹鍒頒竴甯э紝騫朵笉绔嬪嵆鎶婅甯у彂緇欎笅娓哥殑緙栫爜 Filter錛岃屾槸鎶婅鏁板櫒鐨勫煎姞1錛屽綋璁℃暟鍣ㄧ殑鍊艱揪鍒版渶澶у兼椂鎵嶆妸褰撳墠鏀跺埌鐨勫撫鍙戝嚭鍘匯傚湪鎺ユ敹绔彂鎺у埗甯х巼鍛戒護緇欓噰闆嗙鍙互寰堟柟渚跨殑瀹炵幇甯х巼鐨勮繙绔帶 鍒躲?br> 紼嬪簭鐗囨柇濡備笅錛?br>
鍔犱簡甯х巼鎺у埗Filter鐨勫彂閫佺 Filter Graph 濡傚浘4鎵紺猴細
2 Microsoft DirectX C++ SDK Document [EB/OL],2003
3 闄嗗叾鏄?DiectShow寮鍙戞寚鍗梉M].鍖椾含.娓呭崕澶у鍑虹増紺?2004
4 闄嗗叾鏄?DiectShow瀹炲姟綺鵑塠M].鍖椾含:縐戝鍑虹増紺?2004
5 寮犳槑鍗?銆婂熀浜嶳TP鐨勮棰戜紶杈撴帶鍒舵柟娉曠殑鐮旂┒銆媅D].閮戝窞甯傦細閮戝窞澶у, 2004.3
6 Jori Liesenborgs JRTPLIB 3.1.0 [EB/OL]
]]>
![]() ![]() |
![]() 鍥? 緗戠粶瑙嗛鍜岄煶棰戜氦浜掔殑Graph鍥?/div> |
static const GUID CLSID_FG729Render = { 0x3556f7d8, 0x5b5, 0x4015, { 0xb9, 0x40, 0x65, 0xb8, 0x8, 0x94, 0xc8, 0xf9 } }; //闊抽鍙戦? static const GUID CLSID_FG729Source = { 0x290bf11a, 0x93b4, 0x4662, { 0xb1, 0xa3, 0xa, 0x53, 0x51, 0xeb, 0xe5, 0x8e } };//闊抽鎺ユ敹 static const GUID CLSID_FH263Source = { 0xa0431ccf, 0x75db, 0x463e, { 0xb1, 0xcd, 0xe, 0x9d, 0xb6, 0x67, 0xba, 0x72 } };//瑙嗛鎺ユ敹 static const GUID CLSID_FH263Render = { 0x787969cf, 0xc1b6, 0x41c5, { 0xba, 0xa8, 0x4e, 0xff, 0xa3, 0xdb, 0xe4, 0x1f } };//瑙嗛鍙戦?br>//鍙戦佸拰鎺ユ敹闊寵棰戞暟鎹殑filter CComPtr< IBaseFilter > m_pAudioRtpRender ; CComPtr< IBaseFilter > m_pAudioRtpSource ; CComPtr< IBaseFilter > m_pVideoRtpRender ; CComPtr< IBaseFilter > m_pVideoRtpSource ; char szClientA[100]; int iVideoPort = 9937; int iAudioPort = 9938; //鏋勫緩瑙嗛鐨刧raph鍥?騫跺彂閫佹暟鎹?br>CComPtr< IGraphBuilder > m_pVideoGraphBuilder; //瑙嗛鍥懼艦綆$悊鍣? CComPtr< ICaptureGraphBuilder2 > m_pVideoCapGraphBuilder; CComPtr< IBaseFilter > m_pFilterVideoCap; CComPtr< IVideoWindow > m_pVideoWindow; CComPtr< IMediaControl > m_pVideoMediaCtrl ; CComPtr< IBaseFilter > m_pVideoRenderFilter; HRESULT CMyDialog::VideoGraphInitAndSend() { 銆HRESULT hr; 銆hr =m_pVideoGraphBuilder.CoCreateInstance( CLSID_FilterGraph ); 銆if(FAILED(hr)) 銆銆return hr; 銆hr =m_pVideoCapGraphBuilder.CoCreateInstance( CLSID_CaptureGraphBuilder2); 銆if(FAILED (hr)) 銆銆return hr; 銆m_pVideoCapGraphBuilder->SetFiltergraph(m_pVideoGraphBuilder); 銆m_pVideoGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pVideoMediaCtrl); 銆m_pVideoGraphBuilder->QueryInterface(IID_IVideoWindow,(void**)&m_pVideoWindow) 銆FindDeviceFilter(&m_pFilterVideoCap,CLSID_VideoInputDeviceCategory); 銆if(m_pFilterVideoCap) 銆銆m_pVideoGraphBuilder->AddFilter( m_pFilterVideoCap,T2W("VideoCap") ) ; 銆銆//鍒涘緩棰勮鐨刦ilter 銆hr = m_pRenderFilterVideo.CoCreateInstance(CLSID_VideoRenderer); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pVideoGraphBuilder->AddFilter( m_pRenderFilterVideo, L"VideoRenderFilter" ); 銆Connect(m_pFilterVideoCap ,m_pRenderFilterVideo) ; 銆//璁劇疆棰勮鐨勭獥鍙?br> 銆CRect rc ; 銆GetClientRect(m_hOwnerWnd, &rc ); 銆int iWidth = rc.right - rc.left ; 銆int iHeight = rc.bottom - rc.top ; 銆int iLeft, iTop; 銆if((iHeight*1.0)/(iWidth*1.0) >= 0.75) 銆{ 銆銆//鎸夊搴︾畻 銆銆int tmpiHeight = iWidth*3/4; 銆銆iTop = (iHeight - tmpiHeight)/2; 銆銆iHeight = tmpiHeight; 銆銆iLeft = 0; 銆} 銆else 銆{ 銆銆//鎸夐珮搴︾畻 銆銆int tmpiWidth = iHeight*4/3; 銆銆iLeft = (iWidth - tmpiWidth)/2; 銆銆iWidth = tmpiWidth; 銆銆iTop = 0; 銆} 銆m_pVideoWindow->put_Owner( (OAHWND) m_hPreviewWnd ) ; 銆m_pVideoWindow->put_Visible( OATRUE ); 銆m_pVideoWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS ) ; 銆//榪炴帴鍒扮綉緇滃茍鍙戦?br>銆CComPtr< IRtpOption > pRenderOption; 銆CComPtr< IVideoOption > pVideoOption; 銆tagVideoInfo vif(160,120,24); 銆int t=((int)(m_iFrameRate/5)*5)+5; 銆vif.nBitCount=24; 銆vif.nWidth=160; 銆vif.nHeight=120; 銆hr = ::CoCreateInstance(CLSID_FH263Render, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&m_pVideoRtpRender); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pVideoRtpRender->QueryInterface(IID_IJRTPOption, (void**)&pRenderOption); 銆m_pVideoRtpRender->QueryInterface(IID_IVideoOption,(void**)&pVideoOption); 銆pVideoOption->SetProperty(&vif); 銆pVideoOption->SetSendFrameRate(m_iFrameRate,1);//1 涓嶅彂閫佹暟鎹紝0 瀹為檯鍙戦佹暟鎹?br>銆Connect(m_pFilterVideoCap ,m_pVideoRtpRender) ; 銆//榪炴帴瀵規柟 銆hr= pRenderOption->Connect(szClientA,iVideoPort,1024); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pVideoMediaCtrl->Run(); } //瑙嗛鐨勬帴鏀?br>CComPtr< IGraphBuilder > m_pVideoGraphBuilder; //瑙嗛鍥懼艦綆$悊鍣? CComPtr< IBaseFilter > m_pFilterVideoCap; CComPtr< IVideoWindow > m_pVideoWindow; CComPtr< IMediaControl > m_pVideoMediaCtrl ; CComPtr< IBaseFilter > m_pVideoRenderFilter; HWND m_hRenderWnd ; HRESULT VideoRecive() { 銆HRESULT hr; 銆hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC, 銆IID_IFilterGraph,(void**)&m_pVideoGraphBuilder); 銆m_pVideoGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pVideoMediaCtrl); 銆m_pVideoGraphBuilder->QueryInterface(IID_IVideoWindow,(void**)&m_pVideoWindow) 銆 銆hr = ::CoCreateInstance(CLSID_FH263Source, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&m_pVideoRtpSource); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pVideoGraphBuilder->AddFilter(m_pVideoRtpSource, L"My Custom Source"); 銆CComPtr< IRtpOption > m_pRtpOption; 銆CComPtr< IVideoOption > m_pVideoOption; 銆m_pVideoRtpSource->QueryInterface(IID_IJRTPOption, (void **)&m_pRtpOption); 銆m_pVideoRtpSource->QueryInterface(IID_IVideoOption, (void **)&m_pVideoOption); 銆tagVideoInfo vif(160, 120 ,24); 銆m_pVideoOption->SetProperty(&vif); 銆hr= pRenderOption->Connect(szClientA,iVideoPort +1,1024); 銆if(FAILED(hr)) 銆銆return hr; 銆//鍒涘緩棰勮鐨刦ilter 銆hr = m_pRenderFilterVideo.CoCreateInstance(CLSID_VideoRenderer); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pVideoGraphBuilder->AddFilter( m_pRenderFilterVideo, L"VideoRenderFilter" ); 銆Connect(m_pVideoRtpSource ,m_pRenderFilterVideo) ; 銆CRect rc ; 銆GetClientRect(m_hOwnerWnd, &rc ); 銆int iWidth = rc.right - rc.left ; 銆int iHeight = rc.bottom - rc.top ; 銆int iLeft, iTop; 銆if((iHeight*1.0)/(iWidth*1.0) >= 0.75) 銆{ 銆銆//鎸夊搴︾畻 銆銆int tmpiHeight = iWidth*3/4; 銆銆iTop = (iHeight - tmpiHeight)/2; 銆銆iHeight = tmpiHeight; 銆銆iLeft = 0; 銆} 銆else 銆{ 銆銆//鎸夐珮搴︾畻 銆銆int tmpiWidth = iHeight*4/3; 銆銆iLeft = (iWidth - tmpiWidth)/2; 銆銆iWidth = tmpiWidth; 銆銆iTop = 0; 銆} 銆m_pVideoWindow->put_Owner( (OAHWND) m_hRenderWnd ) ; 銆m_pVideoWindow->put_Visible( OATRUE ); 銆m_pVideoWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS ) ; 銆m_pVideoMediaCtrl->Run(); 銆return S_OK; } // HRESULT FindDeviceFilter(IBaseFilter ** ppSrcFilter,GUID deviceGUID) { 銆HRESULT hr; 銆IBaseFilter * pSrc = NULL; 銆CComPtr <IMoniker> pMoniker =NULL; 銆ULONG cFetched; 銆if (!ppSrcFilter) 銆銆return E_POINTER; 銆// Create the system device enumerator 銆CComPtr <ICreateDevEnum> pDevEnum =NULL; 銆hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, 銆IID_ICreateDevEnum, (void **) &pDevEnum); 銆if (FAILED(hr)) 銆銆return hr; 銆// Create an enumerator for the video capture devices 銆CComPtr <IEnumMoniker> pClassEnum = NULL; 銆hr = pDevEnum->CreateClassEnumerator (deviceGUID, &pClassEnum, 0); 銆if (FAILED(hr)) 銆銆return hr; 銆if (pClassEnum == NULL) 銆銆return E_FAIL; 銆if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched))) 銆{ 銆銆hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc); 銆銆if (FAILED(hr)) 銆銆銆return hr; 銆} 銆else 銆銆return E_FAIL; 銆*ppSrcFilter = pSrc; 銆return S_OK; } //鏋勫緩闊抽Graph鍥撅紝騫跺彂閫?br>CComPtr< IGraphBuilder > m_pAudioGraphBuilder; //闊抽鍥懼艦綆$悊鍣? CComPtr< ICaptureGraphBuilder2 > m_pCapAudioGraphBuilder; CComPtr< IBaseFilter > m_pFilterAudioCap; CComPtr< IMediaControl > m_pAudioMediaCtrl ; HRESULT AudioGraphInit() { 銆HRESULT hr; 銆hr =m_pAudioGraphBuilder.CoCreateInstance( CLSID_FilterGraph ); 銆if(FAILED(hr)) 銆銆return hr; 銆hr =m_pCapAudioGraphBuilder.CoCreateInstance( CLSID_CaptureGraphBuilder2); 銆if(FAILED (hr)) 銆銆return hr; 銆m_pAudioGraphBuilder->SetFiltergraph(m_pCapAudioGraphBuilder); 銆m_pAudioGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pAudioMediaCtrl); 銆FindDeviceFilter(&m_pFilterVideoCap,CLSID_AudioInputDeviceCategory); 銆if(m_pFilterAudioCap) 銆銆m_pAudioGraphBuilder->AddFilter( m_pFilterAudioCap,T2W("AudioCap") ) ; 銆//鍙戦佸埌緗戠粶 銆hr =::CoCreateInstance(CLSID_FG729Render,NULL,CLSCTX_INPROC, 銆IID_IBaseFilter,(void**)&m_pFilterRtpSendAudio) 銆if(FAILED(hr)) 銆銆return hr; 銆m_pAudioGraphBuilder->AddFilter(m_pAudioRtpRender, L"FilterRtpSendAudio"); 銆Connect(m_pFilterAudioCap,m_pAudioRtpRender); 銆CComPtr< IRtpOption > pOption ; 銆m_pAudioRtpRender->QueryInterface(IID_IJRTPOption,(void**)&pOption) 銆hr =pOption->Connect(szClientA,iAudioPort,1024); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pAudioMediaCtrl->Run(); 銆return S_OK; } //闊抽鐨勬帴鏀? CComPtr< IGraphBuilder > m_pAudioGraphBuilder; //闊抽鍥懼艦綆$悊鍣? CComPtr< ICaptureGraphBuilder2 > m_pCapAudioGraphBuilder; CComPtr< IBaseFilter > m_pFilterAudioCap; CComPtr< IMediaControl > m_pAudioMediaCtrl ; CComPtr<IBaseFilter> m_pAudioRender; HRESULT AudioRecive() { 銆HRESULT hr; 銆hr =m_pAudioGraphBuilder.CoCreateInstance( CLSID_FilterGraph ); 銆if(FAILED(hr)) 銆銆return hr; 銆m_pAudioGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pAudioMediaCtrl); 銆hr = m_pAudioRtpSource->CoCreateInstance(CLSID_FG729Source) ; 銆if(FAILED(hr)) 銆銆return hr; 銆m_pAudioGraphBuilder->AddFilter(m_pAudioRtpSource,L"AudioRtp"); 銆//鍒涘緩澹板崱Renderfilter 銆FindDeviceFilter(&m_pAudioRender,CLSID_AudioRendererCategory); 銆m_pAudioGraphBuilder->AddFilter(m_pAudioRender,L"AudioRender"); 銆CComPtr< IRtpOption > pRtpOption ; 銆m_pAudioRtpSource->QueryInterface(IID_IJRTPOption,(void**)&pRtpOption) 銆hr= pRtpOption->Connect(szClientA,iAudioPort+2,1024); 銆if(FAILED (hr)) 銆銆return hr; 銆Connect(m_pAudioRtpSource,m_pAudioRender); 銆 銆m_pAudioMediaCtrl->Run(); 銆return S_OK; } |