锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓轟簡鎺у埗紿楀彛鐨勫ぇ灝忥紝鍦ㄧ獥鍙e垵濮嬪寲鏃訛紝闇瑕佺敤鍒癕INMAXINFO緇撴瀯浣撱?/p>
緇撴瀯浣擄細 瀹炰緥錛?br />1銆佸湪紿楀彛綾繪槧灝凮N_WM_GETMINMAXINFO娑堟伅錛?br />2銆佸湪璇ュ嚱鏁頒慨鏀筂INMAXINFO緇撴瀯浣撴暟鎹細 褰曢煶鎾煶瀹為檯闇姹?/p>
1銆侀殢鏃剁粓姝?/p>
2銆佸綍闊沖茍闈炴枃浠訛紝鑰屾槸褰㈡垚rtp鍙戦?/p>
3銆佹挱闊沖茍闈炴簮浜庢枃浠訛紝鑰屾槸婧愪簬rtp 鍥犳Waveform audio浣跨敤鐨刡uffer杈冨皬錛屼笉鏂殑瑁呰澆/鍙戦?buffer,緇堟鐨勬椂鍊橰eset騫朵笖close. 澶ц嚧濡備笅璋冪敤鐨勫驚鐜?/p>
褰曢煶 waveInUnprepareHeader waveInPrepareHeader waveInAddBuffer 鎾煶 waveOutUnprepareHeader waveOutPrepareHeader waveOutWrite 寰幆鍛ㄦ湡40ms錛屾垜閲囩敤鐨勬槸鍥炶皟鍑芥暟銆傞棶棰樻槸鏈夋椂鍊欒皟鐢╳aveInReset/waveOutReset浼氬艦鎴愭閿侊紝璋冪敤waveInReset/waveOutReset鐨勭嚎紼嬩笌鍥炶皟鍑芥暟鎵鍦ㄧ殑綰跨▼姝婚攣鍦ㄤ竴鍧椾簡銆?/p>
榪欐柟闈㈢綉涓婃湁鏂囩珷鎻愬埌錛屽氨鏄皟鐢╳aveInReset/waveOutReset鐨勫悓鏃惰皟鐢ㄤ簡褰曢煶/鎾煶寰幆璋冪敤鐨勬煇涓嚱鏁頒細褰㈡垚姝婚攣銆傛垜鍐嶇◢浣滆В閲婁笅錛屾垜浠煡閬揵uffer婊′簡鎴栨槸璋冪敤Reset閮戒細瑙﹀彂娑堟伅錛堝洖璋冨嚱鏁版柟寮忕殑璇濆氨鏄疢M_WOM_DONE/MM_WIM_DATA錛夛紝鐢變簬璋冪敤waveInReset/waveOutReset鎵鍦ㄧ殑綰跨▼錛屼笌鍥炶皟鍑芥暟鎵鍦ㄧ殑綰跨▼涓嶆槸涓涓嚎紼嬶紝鍥犳寰堝鏄撴挒杞︼紝涔熷氨鏄錛屼綘璋冪敤reset鐨勬椂鍊欙紝鍙︿竴涓嚎紼嬫濂藉湪澶勭悊MM_WOM_DONE/MM_WIM_DATA錛屼簬鏄氨榪欐牱姝婚攣浜嗐?/p>
鍏堝姞涓婃爣璁?鍋囪鏍囪bReset:bool)錛屼護bReset涓簍rue; 鏍囪浣滅敤濡備笅 if(!bReset) { 褰曢煶 waveInUnprepareHeader waveInPrepareHeader waveInAddBuffer 鎾煶 waveOutUnprepareHeader waveOutPrepareHeader waveOutWrite } 寤舵椂璋冪敤waveInReset/waveOutReset錛屽歡鏃舵椂闂撮暱搴︿互寰幆鍛ㄦ湡涓哄錛屾垜榪欎釜渚嬪瓙涓篃灝辨槸閲囩敤40ms銆?/p>
褰撶劧涔熷彲浠ラ噰鐢ㄤ復鐣屼繚鎶ゃ?/p>
鎹竴涓搴﹀幓鑰冭檻闂錛屼箣鎵浠ユ閿侊紝鏄洜涓轟袱涓嚎紼嬪啿紿佷簡鐨勭紭鏁咃紝鎵浠ュ彲浠ュ緩绔嬩竴涓嚎紼?/p>
褰曢煶 waveInUnprepareHeader waveInPrepareHeader waveInAddBuffer 鎾煶 waveOutUnprepareHeader waveOutPrepareHeader waveOutWrite 涓巜aveInReset/waveOutReset閮芥斁鍒拌繖涓嚎紼嬪幓澶勭悊錛岃嚜鐒朵笉浼氬彂鐢熸閿佷簡銆?/p>
寰蔣鐨勪唬鐮佺鍚嶈蔣浠?SignCode.exe 鐨勭己鐪佺殑“鍏稿瀷”絳懼悕綾誨瀷錛屽氨鏄?#8220;浠庡瓨鍌ㄥ尯閫夋嫨”絳懼悕璇佷功錛屽悓鏃剁敱浜庡井杞殑 Office 瀹忎唬鐮佺鍚嶅彧鏀寔鍚屾椂鍖呭惈浜嗙閽ュ拰鍏挜鐨?PFX 鏍煎紡絳懼悕璇佷功錛屼篃灝辨槸鐩存帴“浠庡瓨鍌ㄥ尯閫夋嫨”絳懼悕璇佷功銆傚湪鏀跺埌璇佷功鍚庤鐢ㄦ埛鍏?Windows 鐨勮瘉涔﹀瓨鍌ㄥ尯瀵煎嚭澶囦喚絳懼悕璇佷功錛屽鍑虹殑璇佷功鏍煎紡涓?PFX 鏍煎紡錛屼繚綆″ソ璇佷功鐨勫瘑鐮併?br /> 涓嬭澆VeriSign浠g爜絳懼悕璇佷功鐨勪腑綰ф牴璇佷功錛?br />http://www.verisign.com/support/verisign-intermediate-ca/code-signing-intermediate/index.html (1) 榪愯 Signcode.exe 錛岃姹傛偍閫夋嫨闇瑕佺鍚嶇殑鏂囦歡錛屾敮鎸侊細鍙墽琛屾枃浠?(*.exe; *.dll; *.ocx) 錛?Cabinet 鎵撳寘鏂囦歡 (*.cab) 鍜岀洰褰曟枃浠?(*.cat) 錛屽涓嬪浘 1 鎵紺?( 濡傦細 TestSign.cab) 錛岃娉ㄦ剰錛氬鏋滅鍚嶇殑鏂囦歡宸茬粡鏈夋暟瀛楃鍚嶏紝鍒欎細琚柊鐨勭鍚嶈鐩?span class="Apple-converted-space"> VeriSign 鍏嶈垂鎻愪緵鐨勬椂闂存埑URL錛?strong style="color: rgb(86,87,89); font-size: 12px">http://timestamp.verisign.com/scripts/timestamp.dll 鏃墮棿鎴蟲湇鍔¢潪甯擱噸瑕侊紝娣誨姞鏃墮棿鎴沖悗錛屽嵆浣挎偍鐨勪唬鐮佺鍚嶈瘉涔﹀凡緇忚繃鏈燂紝浣嗙敱浜庢偍鐨勪唬鐮佹槸鍦ㄨ瘉涔︽湁鏁堟湡鍐呯鍚嶇殑錛屽垯鏃墮棿鎴蟲湇鍔′繚璇佷簡姝や唬鐮佷粛鐒跺彲淇★紝鏈緇堢敤鎴蜂粛鐒跺彲浠ユ斁蹇冧笅杞斤紝浣垮緱鍗充嬌浠g爜絳懼悕璇佷功宸茬粡榪囨湡錛屾偍涔熸棤闇閲嶇宸茬粡絳懼悕鐨勪唬鐮併?/p>
鍦╒OIP鐨勯煶棰戠畻娉曚腑錛屽洖闊沖鐞嗗凡緇忔垚涓轟竴涓叧緋婚氳瘽璐ㄩ噺鐨勪富瑕侀棶棰樸?/strong> 鍥炲0鐨勪駭鐢熷湪IP緗戠粶涓昏鏈変袱縐嶏細 澹板鍥炲0涓昏鍙堝垎鎴愪互涓嬪嚑縐? 鐢變簬IP緗戠粶涓嬬殑浼犺緭鐨勫歡榪熻緝澶?鑰屼竴鑸儏鍐典笅,瀵逛簬浜鴻?濡傛灉澹伴煶寤惰繜杈懼埌浜?0ms浠ヤ笂鐨勮瘽,閭d箞鍥炲0灝變細瓚婃潵瓚婃槑鏄? 鍥炲0娑堥櫎鐨勬ā鍨? Speex鏄竴濂椾笓闂ㄧ敤浜庡帇緙╁0闊崇殑搴?/span>,鐢變簬鍏朵笓闂ㄩ拡瀵瑰0闊?/span>,鎵浠ュ帇緙╁0闊崇殑鎬ц兘闈炲父楂?/span>.Speex鐢變簬鍏跺帇緙╂ц兘,鍙?/span>0.80鐗堝悗鐨勮法騫沖彴鐨勬ц兘,鎵浠ュ湪緗戠粶澹伴煶鐨勪紶杈撲腑鏈夊緢澶х殑浠峰?/span>.浣嗘槸闇瑕佹敞鎰忕殑鏄?/span>speex鍙兘瀵瑰0闊寵繘琛屽帇緙?/span>,涓嶆敮鎸侀煶涔愮殑鍘嬬緝,濡傛灉浣犻渶瑕侀煶涔愮殑鍘嬬緝浣犳垨璁擱渶瑕佺敤vorbis搴?/span>. 浣嗘槸鐨?/span>speex璧勬枡鍍忓叾瀹冨ぇ閮芥暟涓撶敤搴撲竴鏍?/span>,騫舵病鏈夊ぇ澶氱殑涓枃璧勬枡.鎵浠ュ湪榪欓噷鎴戝喅瀹氬皢閲岄潰鏈鏍稿績鐨勭紪紼嬫妧鏈炕璇戝嚭鏉?/span>.涓鏉ユ槸緇冧範緇冧範鑷繁緲昏瘧璧勬枡鐨勮兘鍔?/span>,浜屾潵鏄柟渚夸竴浜涜嫳璇按騫寵緝宸殑鏈嬪弸.鐢變簬鏈漢鑳藉姏鏈夐檺,鏈変簺鎰熻鏈夊嚭鍏ユ垨闅劇悊瑙g殑鍦版柟鍙互鍘?/span>speex鐨勫畼鏂圭綉绔?/span>www.speex.org鎵懼埌鑻辨枃鍘熺増鐨勮鏄?/span>. 緲昏瘧鐨勪竴浜涜鏄?/span>: 1,瀵逛簬涓浜涗笓鏈夊悕璇嶅speex,api涓嶈繃琛岀炕璇?/span> 2,瀵逛簬涓浜涙柊姒傚康緲昏瘧,浠ュ強鍏跺畠鐨勭炕璇戣繃鏉ヤ篃璁鎬細浜х敓姝т箟鐨勬枃瀛?/span>,鐢ㄤ腑/鑻變袱縐嶆柟寮忔爣鍑?/span>: 濡?/span>:瀵硅瘽(speech),浣嶉噰闆?/span>(bit_packing) 3,鍩烘湰鍋氬埌鍜岃嫳鏂囧師琛屽璇?/span>.鍙婅嫳鏂囧師鏂囦竴琛?/span>,涓枃緲昏瘧榪囨潵涔熸槸涓琛?/span>,浣跨炕璇戝悗鐨勬枃绔犲拰鍘熸枃鍩烘湰琛岃瀵圭収. 4,婧愪唬鐮佷笉緲昏瘧,濡?/span>SpeexBits bits; 5,璇█涓殑鍏沖仴瀛椾笉璇?/span>,濡?/span>float 6,涓姝や笉鏄叧鍋ュ瓧浣嗚嫳鏂囬氬父鍑虹幇鐨勮瘝絎竴嬈′互涓?/span>/鑻辨枃鏍煎紡緇欏嚭,涔嬪悗鎸夊叿浣撴儏鍐電粰鍑鴻嫳鏂囨垨涓枃,濡?/span>:frame(甯?/span>), 7,瀵逛竴浜涙湁鑷繁緲昏瘧璧鋒潵鎰熻鏈夋涔夌殑鍦版柟,鍔犳枩綰夸綔鏍囪 1,speex鐨勪粙緇?鐣? 2鐗瑰緛鎻忚堪 榪欎釜绔犺妭灞曠ず浜?/span>speex鐨勪富瑕佺壒寰?/span>,浠ヨ。涓浜涘叧浜庡璇?/span>(speech)緙栫爜鐨勪竴涓蹇?/span>,浠ヤ究 甯姪鎴戜滑鏇村ソ鐨勪簡瑙d笅涓绔犺妭. 鍙栨牱鐜?span>(Sampling rate) Speex涓昏鏄璁′簡涓夌涓嶅悓鐨勫彇鏍風巼:8kHz,16kHz,32kHz.榪欎簺鍒嗗埆浠h〃浜嗙獎瀹?/span>(narrowband), 澶氶鐜?/span>,瓚呭0. 璐ㄩ噺 Speex緙栫爜澶ч兘鏁版椂闂存槸琚竴涓寖鍥翠負0鍒?/span>10鐨勮川閲忓弬鏁版潵鎺у埗 鐨?/span>.鍦ㄤ竴涓瘮鐗圭巼涓哄父閲?/span>(CBR)鐨勬搷浣滀腑,璐ㄩ噺鍙傛暟鏄竴涓暣鏁?/span>,鑰屽浜庡彉鍔ㄧ殑姣旂壒鐜?/span>(VBR)鍙傛暟鏄竴涓?/span>float; 澶嶆潅鎬?/span>(鍙橀噺) 鐢?/span>speex,浣犲彲浠ュ皢緙栫爜璁劇疆鎴愬厑璁哥殑澶嶆潅搴?/span>.榪欑敱涓涓寖鍥翠負1鍒?/span>10鐨勬暣鏁版潵鎺у埗瀹屾垚,灝卞儚浣犵敤閫夐」-1鍒?/span>-9鏉ユ帶鍒?/span>gzip鍜?/span>bzip2鐨勫帇緙╄川閲?/span>.鍦ㄩ氬父鐨勮繍鐢ㄤ腑,鍣0綰у埆鐨勫鏉傚害1鏄湪1鍒?/span>2dB涔嬮棿,姣斿鏉傚害10瑕侀珮,浣嗘槸CPU闇瑕佸鏉傚害10澶ф5鍊嶉珮琛屽鏉傚害1.鍦ㄥ疄璺典腑,鏈濂界殑鏄緗湪2鍒?/span>4涔嬮棿,灝界鏇撮珮鐨勮瀹氶氬父鏈夌敤,褰撶紪鐮佷竴涓潪瀵硅瘽澹伴煶(non-speech sounds)鍍?/span>DTMF璇皟(tones). 鍙樻嘗鐗圭巼(VBR Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to 鍙樻嘗鐗圭巼(VBR)鍏佽緙栫爜鍔ㄦ佸湴鏀瑰彉瀹冪殑娉㈢壒鐜囦互閫傚簲澹伴煶緙栫爜鐨?/span>”闅懼害”.鍦?/span>speex涓句緥鏉ヨ, 鍍忓厓闊?/span>(vowel)鍜岀灛闂撮珮闊?/span>(high-enenrg transients)闇瑕佷釜楂樼殑姣旂壒鐜囨潵 鍙栧緱涓涓笉閿欑殑璐ㄩ噺, 鑰屾懇鎿﹂煶(fricative)鍙互琚厖鍒嗗湴鐢ㄧ浉瀵硅緝灝戠殑瀛楄妭鏉ヨ繘琛岀紪鐮?/span>. 鐢變簬涓婇潰榪欎釜鍘熷洜,VBR鍙互璋冭妭鍒頒竴涓綆鐨勬瘮鐗圭巼鍗磋揪鍒頒竴涓悓鏍風殑璐ㄩ噺,鎴栬呯敤 鏌愪釜姣旂壒鐜囪揪鍒版洿濂界殑璐ㄩ噺.灝界鏈変笂闈㈣繖浜涗紭鐐?/span>,浣嗘槸VBR涔熸湁涓や釜涓昏鐨勭己鐐?/span>. 棣栧厛,浠呬粎闈犳寚瀹氳川閲忓?/span>,榪欓噷娌℃湁涓涓叧浜庢渶鍚庡鉤鍧囨瘮鐗圭巼鐨勪繚璇?/span>.(璇戣呮敞:浣滆呭ぇ姒傛槸鎯寵娌℃湁浠涔堟槑紜殑鏂規硶鐭ラ亾璐ㄩ噺鍊?/span>)姝ゅ,瀵逛竴浜涘嵆鏃?/span> 閫氫俊,鍍?/span>IP鐢佃瘽(VoIP)榪欑鍖呭惈鐫鏈澶х殑姣旂壒鐜囩殑,蹇呴』鎶婃瘮鐗圭巼璁句負瓚沖浣庝互閫傚簲 浼犺緭閫氶亾. r 騫沖潎姣旂壒鐜?span>(ABR) 騫沖潎姣旂壒鐜囬氳繃鍔ㄦ佸湴璋冭妭VBR璐ㄩ噺鍘誨緱鍒頒竴涓‘瀹氱殑鐩爣鐨勬瘮鐗圭巼,浠庤岃В鍐充簡VBR涓殑涓涓棶棰?/span>..鍥犱負璐ㄩ噺/姣旂壒鐜囪鍗蟲椂鐨勮皟鏁翠簡,鏁翠綋璐ㄩ噺灝嗕細紼嶇◢浣庝簬鐢?/span>VBR瀵逛竴涓?/span> 璁劇疆寰楀拰鐩爣騫沖潎姣旂壒鐜囬潪甯告帴榪戠殑璐ㄩ噺鏁扮紪鐮佸緱鍒扮殑緇撴灉. 澹伴煶鐢熷姩鎬ф嫻?span>(VAD) 澹伴煶鐢熷姩鎬ф嫻嬪皢浼氬彂瑙夐煶棰戞鍦ㄨ緙栫爜鎴愬璇?/span>,闈欓煶,鎴栬儗鏅櫔闊?/span>.VAD鎬誨湪鐢?/span>VBR榪涜緙栫爜鏃舵殫涓搗浣滅敤,鍥犳閫夐」浠呬粎瀵逛竴涓笉鏄?/span>VBR鐨勬搷浣滆搗浣滅敤.瀵逛簬涓嶆槸VBR鐨勬搷浣滄潵璇?/span>,speex瀵熻鍑轟竴涓笉灞炰簬瀵硅瘽鐨勫懆鏈?/span>,鐒跺悗瀵瑰畠鐢ㄨ凍澶熺殑瀛楄妭閲嶆柊鐢熸垚涓鴻儗鏅櫔闊?/span>.涓嶈繖鍙仛鑸掗傜殑鍣煶鐢熸垚(CNG). 涓嶈繛緇紶杈?span>(DTX) 涓嶈繛緇紶杈撴槸VAD/VBR鎿嶄綔鐨勪竴涓澶栭夐」,褰撹儗鏅櫔闊充竴瀹氭椂,瀹冨彲浠ュ畬鏁村湴浼犺緭.鍥犱負鍦ㄥ熀浜庢枃浠剁殑鎿嶄綔涓?/span>,鎴戜滑涓嶈兘鍋滄瀵規枃浠惰繘琛屽啓鍏?/span>,鎵浠ュ彧鏈?/span>5瀛楄妭琚繖縐嶅撫鎵榪愮敤.(緇?/span>250bps閫氫俊) Perceptual enhancement 鐭ヨ澧炲己 鐭ヨ澧炲姞鏄В鐮佺殑涓閮ㄥ垎,瀹冨湪鎵撳紑鐨勬椂鍊欑敤鏉ュ噺灝戠敱緙栫爜瑙g爜鎵浜х敓鐨勫櫔闊?/span>.鍦ㄥぇ閮芥暟 鎯呭喌涓?/span>,鐭ヨ澧炲己鍦ㄥ瑙備笂浣垮0闊崇鍘熷鍊兼洿榪?/span>(濡傛灉鐢?/span>SNR),浣嗘槸鍦ㄦ渶鍚庡畠浠嶇劧鍚搗鏉ユ洿濂?/span>(涓昏涓婄殑鏀硅繘) Algorithmic delay 榪熸椂綆楁硶 姣忎竴涓0闊崇紪鐮佸鑷翠簡鍦ㄤ紶杈撲笂鐨勫歡鏃?/span>.瀵逛簬speex,榪欑寤舵椂絳変簬frame鐨勫ぇ灝忓姞涓婁竴浜?/span> 鏁伴噺鐨勯渶瑕佸姣忎竴甯ц繘琛岀殑鍓嶇灮(”look-adhead”). 鍦ㄧ獎瀹芥搷浣滀腑(8kHz),榪熸椂鏄?/span>30ms,鑰屽浜庡棰戠巼(2-44Hz),榪熸椂鏄?/span>34ms.榪欎簺鍊?/span> 涓嶅寘鎷?/span>CPU緙栫爜,瑙g爜甯х殑鏃墮棿. 鐢?span>speex緙栫▼(the libspeex api) 榪欎釜绔犺妭鍑鴻璁茶堪浜嗗浣曠敤speex api榪涜緙栫▼.渚嬪瓙鐨勬簮浠e弸浣犱篃鍙互鍦ㄩ檮褰?/span>B涓壘鍒?/span> 4.1 Encoding 4.1鍘嬬緝 涓轟簡鐢?/span>Speex鍘嬬緝瀵硅瘽,浣犻鍏堥渶瑕佸紩鐢ㄥご鏂囦歡: #include <speex.h> 鐒跺悗浣犻渶瑕佸畾涔変竴涓?/span>Speex鐨勪綅閲囬泦(bit-packing)緇撴瀯 SpeexBits bits; and a Speex encoder state 浠ュ強瀹氫箟涓涓?/span>speex緙栫爜鍣ㄧ姸鎬侀噺 void *enc_state; 涓婇潰瀹氫箟鐨勮繖鏍瘋鍒濆鍖?/span>: The two are initialized by: speex_bits_init(&bits); enc_state = speex_encoder_init(&speex_nb_mode); 涓轟簡鏀寔澶氶鐜囩殑鍘嬬緝,speex_nb_mode灝嗚sppex_wb_mode鍙栦唬.鍦ㄥぇ閮芥暟 鎯呭喌涓?/span>,浣犻渶瑕佺煡閬撲綘鐢ㄧ殑妯″紡(mode)鐨勫撫(frame)鐨勫ぇ灝?/span>,浣犲彲浠ュ緱鍒板湪frame_size鍙橀噺閲屽緱鍒拌繖鍊?/span>: speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size); 涓浣嗗垵濮嬪寲瀹屾瘯,瀵逛簬姣忎竴涓緭鍏ュ撫: speex_bits_reset(&bits); speex_encode(enc_state, input_frame, &bits); nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES); 涓婇潰input_frame鏄竴涓寚鍚戝璇?/span>(speech)甯?/span>(frame)鐨?/span>float鎸囬拡(pointing);byte_ptr 鏄寚鍚戠紪鐮佸撫寮濮嬪啓鐨勫湴鏂圭殑char鎸囬拡,MAX_NB_BYTES鏄兘 鍐欒繘byte_ptr鑰屼笉浼氶犳垚婧㈠嚭鐨勬渶澶ф暟.nbBytes鏄竴涓疄闄呭啓鍏?/span>btye_ptr鐨勬暟,鍗崇紪鐮佺殑瀹為檯澶у皬 鍦ㄨ皟鐢?/span>speex_bits_write鍓?/span>,鍙兘浣犻渶瑕佽皟鐢?/span>speex_bits_nbytes(&bits)寰楀埌闇瑕佸啓鍏?/span>(write)鐨勫瓧鑺傚ぇ灝?/span>. 鍦ㄤ綘宸茬粡緙栫爜鍚?/span>,閲婃斁鎵鏈夌殑璧勬簮. speex_bits_destroy(&bits); speex_encoder_destroy(enc_state); That’s about it for the encoder. 榪欏氨鏄叧浜庣紪鐮佺殑鏂歸潰. 闄勬簮浠g爜鐨勭炕璇?/span>: B Sample code B 渚嬬▼婧愪唬鐮?/strong> 榪欎釜绔犺妭婕旂ず浜嗕竴孌電敤speex緙栫爜,瑙g爜瀵硅瘽(speech)鐨勬簮浠g爜. 鍙互濡備笅鐢?/span>api鍛戒護鏉ョ紪鐮佸茍瑙g爜涓涓枃浠?/span>: 璇戣呮敞:榪欓噷璇寸殑api鍛戒護鏄寚unix鐨勭敤”|”榪涜綆¢亾鍐欏叆璇誨嚭.鍦?/span>windows涓嬭繖鏍峰茍涓嶈兘瀹炵幇. % sampleenc in_file.sw | sampledec out_file.sw 榪欓噷榪欎袱孌典唬鐮侀兘娌℃湁寮曠敤鍏跺畠鐨勫ご鏂囦歡,騫朵互16 姣旂壒鐜?/span>(bits)榪涜緙栫爜 natural endianness). B.1 sampleenc.c Sameleenc 鐢ㄤ竴涓湭鍔犲伐鐨?/span>16姣旂壒鐜?/span>(bits)鏂囩珷,緇欏畠緙栫爜騫朵駭鐢熶竴涓?/span>speex 嫻?/span>(steam)緇欐爣鍑嗚緭鍑?/span>.娉ㄦ剰宸插帇緙╃殑鍜?/span>speexenc/speexdec涓嶅拰璋?/span>! #include <speex.h> #include <stdio.h> /*甯х殑澶у皬鍦ㄨ繖涓緥紼嬩腑鏄竴涓浐瀹氱殑鍊?/span>,浣嗗畠騫朵笉鏄繀欏昏繖鏍?/span>*/ #define FRAME_SIZE 160 int main(int argc, char **argv) { char *inFile; FILE *fin; short in[FRAME_SIZE]; float input[FRAME_SIZE]; char cbits[200]; int nbBytes; /*淇濆瓨緙栫爜鐨勭姸鎬?/span>*/ void *state; /*淇濆瓨瀛楄妭鍥犳浠栦滑鍙互琚?/span>speex甯歌璇誨啓*/ SpeexBits bits; int i, tmp; //鏂板緩涓涓柊鐨勭紪鐮佺姸鎬佸湪紿勫(narrowband)妯″紡涓?/span> state = speex_encoder_init(&speex_nb_mode); //璁劇疆璐ㄩ噺涓?/span>8(15kbps) tmp=8; speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); inFile = argv[1]; fin = fopen(inFile, "r"); //鍒濆鍖栫粨鏋勪嬌浠栦滑淇濆瓨鏁版嵁 speex_bits_init(&bits); while (1) { //璇誨叆涓甯?/span>16bits鐨勫0闊?/span> fread(in, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; //鎶?/span>16bits鐨勫艱漿鍖栦負float,浠ヤ究speex搴撳彲浠ュ湪涓婇潰宸ヤ綔 for (i=0;i<FRAME_SIZE;i++) input[i]=in[i]; //娓呯┖榪欎釜緇撴瀯浣撻噷鎵鏈夌殑瀛楄妭,浠ヤ究鎴戜滑鍙互緙栫爜涓涓柊鐨勫撫 speex_bits_reset(&bits); //瀵瑰撫榪涜緙栫爜 speex_encode(state, input, &bits); //鎶?/span>bits鎷瘋礉鍒頒竴涓埄鐢ㄥ啓鍑虹殑char鍨嬫暟緇?/span> nbBytes = speex_bits_write(&bits, cbits, 200); //棣栧厛鍐欏嚭甯х殑澶у皬,榪欐槸sampledec鏂囦歡闇瑕佺殑涓涓?/span>,浣嗘槸浣犵殑搴旂敤紼嬪簭涓彲鑳戒笉涓鏍?/span> fwrite(&nbBytes, sizeof(int), 1, stdout); //鍐欏嚭鍘嬬緝鍚庣殑鏁扮粍 fwrite(cbits, 1, nbBytes, stdout); } //閲婃斁緙栫爜鍣ㄧ姸鎬侀噺 speex_encoder_destroy(state); //閲婃斁bit_packing緇撴瀯 speex_bits_destroy(&bits); fclose(fin); return 0; } 鍦⊿peex錛?a style="background-color: transparent; color: rgb(51,102,153); text-decoration: none; background-origin: initial; background-clip: initial" >www.speex.org錛夌殑鏈鏂扮増鏈腑錛屽紑濮嬮泦鎴愪簡鍥為煶娑堥櫎鐨勬ā鍧楋紝鑰屽洖闊蟲秷闄や竴鐩存槸Voip涔嬩腑浜熷緟瑙e喅鐨勪富瑕侀棶棰樸?br />寰堝鏈嬪弸鍜屾垜璇磗peex鐨刟ec妯″潡鐨勬晥鑳藉茍涓嶅ソ錛屾垜浠厛鏉ョ湅涓涓媠peex鐨刟ec鐨刟pi璋冪敤鏂瑰紡銆?/p>
/* frame_size 鐨勫彇鍊兼渶濂芥槸涓涓紪鐮佺殑frame澶у皬錛?鍦ㄤ綆甯﹀鏉′歡涓嬶紝涓鑸歡榪?0ms錛岃屽ぇ灝忎負160 鑰屽叾涓璮ilter_length鐨勮瀹氭槸涓涓叧閿?/p>
/* 鍏朵腑: output_frame 鏄鐞嗗畬浠ュ悗杈撳嚭鐨勫0闊?/p>
residue鏄竴涓彲閫夊弬鏁?濡傛灉涓嶄嬌鐢ㄥ彲浠ュ皢涔嬭緗負NULL, 涔熷彲浠ラ氳繃preprocessor 鏉ユ帶鍒?/p>
闂鐨勫叧閿槸 澶勭悊input鍜宔cho 涔嬮棿鐨勫叧緋? writetosndcard(echo_frame, frame_size) 鎴戠浉淇″湪澶у鏁版儏鍐典笅錛岄兘鏄洜涓哄0闊蟲崟鎹夊拰澹伴煶鎾斁涔嬮棿鐨勫悓姝ラ棶棰樻病鏈夊鐞嗗ソ錛屽鑷寸殑闊抽璐ㄩ噺涓嬮檷銆?/p>
/* speex_echo_state_reset(echo_state); 璇存槑錛?br />鎹鍦⊿peex鐨勬渶鏂扮殑1.2beta鐗堟湰涓婏紝Speex鎻愪緵浜嗗彲閫夋嫨鐨勶紝綆鍖栫殑API錛屾潵鎻愰珮echo鎵ц榪囩▼涓殑鍚屾闂銆?/p> AEC鍥炲0鎶戝埗綆楁硶錛岃繖涓瘮杈冮毦錛岀洰鍓嶅彲浠ヤ嬌鐢╠irectsound榪涜澶勭悊錛屼笉榪囧彧鑳藉湪xp涓嬩嬌鐢紝鍒殑緋葷粺涓嶆敮鎸侊紒 AEC 妯″潡鏄?Microsoft DirectSound 搴曞眰緇撴瀯鐨勪竴閮ㄥ垎銆傝緇勪歡鍖呮嫭涓嬪垪鐗規у拰闄愬埗錛?/p>
AEC鍙湪涓嶈秴榪?25×15×9 鑻卞昂鐨勫皬鎴塊棿鎵嶄細鏈夋晥錛?span class="Apple-converted-space"> extern "C" const GUID IID_IDirectSoundBuffer8 = {0x6825a449, 0x7524, 0x4d82,{ 0x92, 0x0f, 0x50, 0xe3, 0x6a, 0xb3, 0xab, 0x1e}}; //鎹曟崏緙撳啿鍖篈EC鍜孨S鏁堟灉銆?br />DSCEFFECTDESC efft[2]; HWND win = AfxGetApp()->m_pMainWnd->m_hWnd; if(!FAILED(hr)) A pointer to the size, in bytes, of the "from" buffer required only if lpFrom is specified. 浣犱細鍙戠幇,榪欎釜鍙傛暟鏄竴涓緭鍏ヨ緭鍑哄?鑰學SARecvFrom鎶曢掔殑鏄竴涓紓姝ョ殑IOCP璇鋒眰,鏁呰?鍑轟簡姝ゆ柟娉?CUDPRecvSendThread::postRecvRequest)涔嬪悗,nSenderAddrSize榪欎釜涓存椂鍙橀噺灝變細琚洖鏀?涓嶅嚭浜嬫墠鎬簡. 鐢‵FMPEG SDK榪涜瑙嗛杞爜鍘嬬緝鐨勬椂鍊欙紝杞爜鎴愬姛鍚庡幓鐪嬭棰戠殑鍐呭錛屽彂鐜伴煶瑙嗛鏄笉鍚屾鐨勩傝繖涓殑紜槸涓涓伡鐏殑浜嬫儏銆傛垜鍦ㄧ敤FFMPEG SDK鍋歨264鏍煎紡鐨凢LV鏂囦歡緙栫爜Filter鐨勬椂鍊欏氨紕板埌浜嗚繖涓棶棰樸?/p>
緇忚繃鐮旂┒鍙戠幇錛孎FMPEG SDK鍐欏叆瑙嗛鐨勬椂鍊欐湁涓や釜鍦版柟鐢ㄦ潵鎺у埗鍐欏叆鐨勬椂闂存埑錛屼竴涓槸AvPacket, 涓涓槸AvFrame銆?鍦ㄨ皟鐢╝vcodec_encode_video鐨勬椂鍊欓渶瑕佷紶鍏vFrame鐨勫璞℃寚閽堬紝涔熷氨鏄紶鍏ヤ竴甯ф湭鍘嬬緝鐨勮棰戣繘琛屽帇緙╁鐞嗭紝AvFrame鍖呭惈涓涓猵ts鐨勫弬鏁幫紝榪欎釜鍙傛暟灝辨槸褰撳墠甯у皢鏉ュ湪榪樺師鎾斁鐨勬椂鍊欑殑鏃墮棿鎴熾傝孉vPacket閲岄潰涔熸湁pts錛岃繕鏈塪ts銆傝璧瘋繖涓氨蹇呴』瑕佽鏄庝竴涓婭,P,B涓夌瑙嗛鍘嬬緝甯с侷甯у氨鏄叧閿撫錛屼笉渚濊禆浜庡叾浠栬棰戝撫錛孭甯ф槸鍚戝墠棰勬祴鐨勫撫錛屽彧渚濊禆浜庡墠闈㈢殑瑙嗛甯э紝鑰孊甯ф槸鍙屽悜棰勬祴瑙嗛甯э紝渚濊禆浜庡墠鍚庤棰戝撫銆傜敱浜嶣甯х殑瀛樺湪錛屽洜涓哄畠鏄弻鍚戠殑錛屽繀欏葷煡閬撳墠闈㈢殑瑙嗛甯у拰鍚庨潰鐨勮棰戝撫鐨勮緇嗗唴瀹瑰悗錛屾墠鑳界煡閬撴湰B甯ф渶緇堣鍛堢幇浠涔堝浘鍍忋傝宲ts鍜宒ts涓や釜鍙傛暟灝辨槸鐢ㄦ潵鎺у埗瑙嗛甯х殑鏄劇ず鍜岃В鐮佺殑欏哄簭銆?/p>
pts灝辨槸甯ф樉紺虹殑欏哄簭銆?/p>
dts灝辨槸甯ц璇誨彇榪涜瑙g爜鐨勯『搴忋?/p>
濡傛灉娌℃湁B甯у瓨鍦紝dts鍜宲ts鏄浉鍚岀殑銆傚弽涔嬶紝鍒欐槸涓嶇浉鍚岀殑銆傚叧浜庤繖涓殑璇︾粏浠嬬粛鍙互鍙傝冧竴涓媘peg鐨勫師鐞嗐?/p>
鍐嶈璇碅vPacket涓寘鍚殑pts鍜宒ts涓や釜鍒板簳璇ヨ緗粈涔堝鹼紵 pts鍜宒ts闇瑕佽緗殑灝辨槸瑙嗛甯цВ鐮佸拰鏄劇ず鐨勯『搴忋傛瘡澧炲姞涓甯у氨鍔犱竴錛屽茍涓嶆槸鎾斁瑙嗛鐨勬椂闂存埑銆?/p>
浣嗘槸瀹炶返璇佹槑緇忚繃rmvb瑙g爜鐨勮棰戞湁鏃跺欏茍涓嶆槸鍥哄畾甯х巼鐨勶紝鑰屾槸鍙樺撫鐜囩殑錛岃繖鏍鳳紝濡傛灉姣忓帇緙╀竴甯э紝pts鍜宒ts鍔犱竴鐨勬柟妗堜負瀵艱嚧闊寵棰戜笉鍚屾銆?/p>
閭f庝箞鏉ヨВ鍐抽煶瑙嗛鍚屾鐨勯棶棰樺憿錛?/p>
璇風湅濡備笅浠g爜孌點?/p>
lTimeStamp 鏄氳繃directshow 鑾峰彇鐨勫綋鍓嶇殑瑙嗛甯х殑鏃墮棿鎴熾?/p>
m_llframe_index涓哄綋鍓嶅凡緇忕粡榪囧帇緙╁鐞嗙殑甯х殑鏁伴噺銆?/p>
棣栧厛av_rescale璁$畻寰楀埌褰撳墠鍘嬬緝澶勭悊宸茬粡闇瑕佸鐞嗕粈涔堟椂闂存埑鐨勮棰戝撫錛屽鏋滆鏃墮棿鎴沖皻鏈埌杈綿irectshow褰撳墠鎻愪緵鐨勮棰戝撫鐨勬椂闂存埑錛屽垯灝嗚甯т涪寮冩帀銆?/p>
鍚﹀垯榪涜鍘嬬緝鎿嶄綔銆傚茍璁劇疆AVPacket鐨刾ts鍜宒ts銆傝繖閲屽亣璁綛甯т笉瀛樺湪銆?/p>
鍥犱負鍦ㄥ皢鏉ユ挱鏀劇殑鏃跺欒棰戜互鎴戜滑璁懼畾鐨勫浐瀹氭挱鏀懼撫鐜囪繘琛屾挱鏀撅紝鎵浠ラ渶瑕佹牴鎹瀹氱殑鎾斁甯х巼璁$畻寰楀埌鐨勮棰戝撫鏃墮棿鎴沖拰directshow鎻愪緵鐨勫綋鍓嶈棰戝撫鐨勬椂闂存埑榪涜姣旇緝錛岃瀹氭槸鍚﹂渶瑕佽繘琛屽疄鏂藉歡緙撴挱鏀劇殑絳栫暐銆傚鏋滈渶瑕佸歡緙撴挱鏀撅紝鍒欏皢pts澧炲姞姝ラ暱2錛屽惁鍒欎互鏅氶熷害鎾斁錛屽垯璁劇疆涓?.dts涓庝箣鐩稿悓銆?/p>
鑷粯鎺т歡涓粡甯鎬細閬囧埌闂儊鐨勯棶棰橈紝涓昏鍘熷洜鏄煇涓尯鍩熷彂鐢熶簡閲嶅鎬х殑緇樺埗鑰屽鑷寸殑錛岃屽垪琛ㄦ帶浠跺湪鑷粯鍚庨棯鐑佸師鍥犳槸WM_ERASEBKGND娑堟伅鎵瀵艱嚧鐨勩傝В鍐沖畾鍔炴硶鍙互灝嗚繖涓秷鎭睆钄芥帀錛岀劧鍚庝嬌鐢ㄥ弻緙撳瓨錛屽湪Windows 5.1鐗堟湰浠ュ悗鍙互浣跨敤LVS_EX_DOUBLEBUFFER鏍峰紡錛屼負浜嗗悇涓増鏈殑鍏煎鎬ф垜涓漢涓嶅緩璁嬌鐢ㄨ繖涓牱寮忥紝鍥犳鎴戜滑鍙互鎷︽埅WM_PAINT娑堟伅鏉ヤ嬌鐢ㄦ垜浠嚜宸插垱寤虹殑鍙岀紦瀛橈紝鍏蜂綋鐪嬩唬鐮佹墍紺猴細
typedef struct {
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO;
鍙傛暟璇存槑錛?br /> ptMaxSize錛?nbsp; 璁劇疆紿楀彛鏈澶у寲鏃剁殑瀹藉害銆侀珮搴?br /> ptMaxPosition錛?nbsp;璁劇疆紿楀彛鏈澶у寲鏃秞鍧愭爣銆亂鍧愭爣
ptMinTrackSize錛?nbsp;璁劇疆紿楀彛鏈灝忓搴︺侀珮搴?br /> ptMaxTrackSize錛氳緗獥鍙f渶澶у搴︺侀珮搴?br />
void CTestDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
lpMMI->ptMaxSize.x = 800; // 璁劇疆紿楀彛鏈澶у寲鏃剁殑瀹藉害
lpMMI->ptMaxSize.y = 600; // 璁劇疆紿楀彛鏈澶у寲鏃剁殑楂樺害
lpMMI->ptMaxPosition.x = 100; // 璁劇疆紿楀彛鏈澶у寲鏃秞鍧愭爣
lpMMI->ptMaxPosition.y = 100; // 璁劇疆紿楀彛鏈澶у寲鏃秠鍧愭爣
lpMMI->ptMinTrackSize.x = 400; // 璁劇疆紿楀彛鏈灝忓搴?/span>
lpMMI->ptMinTrackSize.y = 400; // 璁劇疆紿楀彛鏈灝忛珮搴?/span>
lpMMI->ptMaxTrackSize.x = 600; // 璁劇疆紿楀彛鏈澶у搴?/span>
lpMMI->ptMaxTrackSize.y = 500; // 璁劇疆紿楀彛鏈澶ч珮搴?/span>
CDialog::OnGetMinMaxInfo(lpMMI);
}
]]>
]]>
闂鑳屾櫙
鍘熷洜鍒嗘瀽
瑙e喅鏂規
鏂規涓
鏂規浜?/h3>
涓嬭澆Thawte浠g爜絳懼悕璇佷功鐨勪腑綰ф牴璇佷功錛?br />https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=AR1382
浣跨敤寰蔣鐨?span class="Apple-converted-space"> SignCode.exe 灝卞彲浠ュ寰蔣鐨勪唬鐮佽繘琛岀鍚嶏紝濡傛灉鎮ㄦ病鏈夋鏂囦歡錛屾偍鍙互鐐瑰嚮 榪欓噷涓嬭澆銆?Signcode.exe 鍙互浣跨敤 DOS 鍛戒護琛屾柟寮忓疄鐜扮鍚嶏紝鎴戜滑鎺ㄨ崘鐢ㄦ埛浣跨敤鏁板瓧絳懼悕鍚戝鏂瑰紡錛岀畝鍗曟柟渚褲傝娉ㄦ剰錛氬鏋滄偍寮鍙戠殑ActiveX涓篒E鍔犺澆欏癸紝璇峰厛鏁板瓧絳懼悕姣忎釜CAB鏂囦歡涓殑.dll鍜?ocx絳夋枃浠訛紝鍐嶆妸榪欎簺鏂囦歡鎵撳寘鎴?cab鏂囦歡鍚庡啀鏁板瓧絳懼悕.cab鏂囦歡錛屼互紜繚鎵鏈塈E鍔犺澆欏歸兘琚獻E楠岃瘉鍜屼俊浠伙紝鍚﹀垯浼氭樉紺?#8220;鏈獙璇?#8221;鑰屽彲鑳藉獎鍝嶆甯歌繍琛屻?br />
鍏蜂綋絳懼悕鍚戝榪囩▼濡備笅錛?/p>
(2) 鐐瑰嚮“涓嬩竴姝?#8221;鍚庯紝濡備笅鍥?2 鎵紺猴紝浼氳姹傛偍閫夋嫨“絳懼悕綾誨瀷”錛?鐩存帴鐐瑰嚮“涓嬩竴姝?#8221;鍗沖彲錛屽嵆閫夋嫨緙虹渷鐨?#8220;鍏稿瀷”絳懼悕綾誨瀷錛?span class="Apple-converted-space">
(3) 濡備笅鍥?3 鎵紺猴紝鐐瑰嚮“浠庡瓨鍌ㄥ尯閫夋嫨”錛屽垯浼氭樉紺烘偍鐨勭數鑴戣瘉涔﹀瓨鍌ㄥ尯鐨勬墍鏈夎瘉涔︼紝鍖呮嫭瀛樺偍鍦ㄧ數鑴戝拰 USB Key 涓殑鎵鏈夋暟瀛楄瘉涔︼紝閫夋嫨鎮ㄧ殑絳懼悕璇佷功鍗沖彲錛?span class="Apple-converted-space">
(4) 濡備笅鍥?4 鎵紺猴紝瑕佹眰濉啓璇ョ鍚嶄唬鐮佺殑鍔熻兘鎻忚堪錛屾帹鑽愪竴瀹氳璁ょ湡濉啓錛屽洜涓烘淇℃伅灝嗕細鍦ㄦ渶緇堢敤鎴蜂笅杞芥浠g爜鏃舵樉紺猴紝鏈夊姪浜庢渶緇堢敤鎴蜂簡瑙f浠g爜鐨勫姛鑳戒互紜畾鏄惁涓嬭澆瀹夎銆傜涓琛?#8220;鎻忚堪”鏄寚姝や唬鐮佺殑鍔熻兘鏂囧瓧鎻忚堪錛岀浜岃“ Web 浣嶇疆”鍒欒鏈緇堢敤鎴風偣鍑繪枃瀛楁弿榪版潵璇︾粏浜嗚В姝や唬鐮佺殑鍔熻兘鍜屼嬌鐢ㄦ柟娉曠瓑銆?/p>

(5) 鐐瑰嚮“涓嬩竴姝?#8221;鍚庯紝濡備笅鍥?9 鎵紺猴紝閫変腑“灝嗘椂闂存埑娣誨姞鍒版暟鎹腑”錛岃浣跨敤:
(6) 鐐瑰嚮“涓嬩竴姝?#8221;鍚庯紝濡備笅鍥?6 鎵紺猴紝浼氭彁紺哄凡緇忓畬鎴愭暟瀛楃鍚嶅悜瀵鹼紝鐐瑰嚮“瀹屾垚”灝卞畬鎴愪簡涓枃鐗堜唬鐮佺鍚嶈瘉涔︾殑浠g爜絳懼悕銆?br />
]]>
1.澹板鍥炲0
2.鐢佃礬鍥炲0
a ) 鐩存帴鍥炲0:鐢辨壃澹板櫒浜х敓鐨勫0闊蟲湭緇忎換浣曞弽灝勭洿鎺ヨ繘鍏ラ害鍏嬮
b ) 闂存帴鍥炲0: 鐢辨壃澹板櫒鍙戝嚭鐨勫0闊崇粡榪囧嬈″弽灝勫悗,鍐嶈繘鍏ic
瀵逛簬絎簩縐嶅洖澹?鎷ユ湁澶氳礬寰?鏃跺彉鎬х殑鐗圭偣.鏄瘮杈冮毦澶勭悊鐨?
涓鑸潵璁?VOIP涓殑澹伴煶寤惰繜涓昏鏉ヨ嚜浜庡嚑涓柟闈?
1. 緙栫爜寤惰繜: 涓鑸儏鍐典笅緙栫爜綆楁硶鍦ㄥ0闊沖帇緙╂椂閮戒細浜х敓寤惰繜,灝辨垜浠噰鐢ㄧ殑Speex鏉ヨ,寤惰繜澶ф鍦?0ms宸﹀彸
2. 澶勭悊寤惰繜, 灝佽鏃跺歡, 緙撳啿鏃跺歡絳?br />3. 鍦↖P緗戠粶涓暟鎹殑浼犺緭榪囩▼涔熶細鐓ф垚寤舵椂.榪欑敱褰撳墠鐨勭綉緇滅姸鍐靛喅瀹?
a) 寤虹珛榪滅澹伴煶妯″瀷,榪涜鍥炲0浼拌, 浠庨噰闆嗙殑鍊間腑鍑忓幓浼拌鍊?br />b) 澹板妯″瀷Speex manul(鎵嬪唽)涓枃鐗?/span>
Speex manul涓枃鐗堜笁
*鍒涘緩AEC瀵硅薄
*/
SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);
filter_length,鏈濂芥槸鎴塊棿鍐呭弽灝勬椂闂寸殑1/3
濡? 涓涓埧闂寸殑鍙嶅皠鏃跺歡涓?00ms
閭d箞榪欎釜filter_length灝辨渶濂芥槸100ms(榪欎釜闀垮害鍙堣縐頒負tail length).
*鎵цAEC
*/
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue);
input_frame: 灝辨槸琚0鍗℃崟鎹夊埌鐨勫0闊?br />echo_frame: 鏄敱鎵0鍣ㄦ挱鏀懼嚭鐨勫0闊?榪欎釜澹伴煶鏄渶瑕佷粠 input_frame涓姷娑堢殑澹伴煶.
涔熷氨鏄鍦ㄦ崟鎹夊埌鐨勪俊鍙峰拰鎾斁鐨勪俊鍙蜂箣闂寸殑寤惰繜蹇呴』瓚沖鐨勫皬,鎵嶅彲浠ユ彁楂樻晥鐜?
readfromsndcard(input_frame, frame_size)
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue)
濡傛灉浣犳兂瑕佸敖鍙兘鐨勫噺灝忎俊鍙蜂腑鐨勫洖闊?閭d箞鍙互灝唕esidue榪欎釜鍙傛暟璁劇疆涓哄櫔闊沖弬鏁?
*閿姣佸拰澶嶄綅
*/
speex_echo_state_destroy(echo_state);
涓嶅啀澶嶈堪浜嗭紒
]]>
]]>
鐩墠gips瀵規湰綆楁硶鏈夊嚭鑹茬殑瀹炵幇錛宻kype灝辨槸浣跨敤鐨勮寮曟搸錛?br />瑕佹兂鑷繁瀹炵幇錛屾亹鎬曞緢鍥伴毦錛?br />
AEC鍙鍗曞0閬撴湁鏁堬紝褰撹緭鍑烘槸澶氫釜閫氶亾鐨勭珛浣撳0鐨勬椂鍊欙紝鍙湁涓涓氶亾鑳藉鍏鋒湁鍥炴嘗鎶墊秷鐨勬晥鏋滐紱
AEC涓嶈兘鎶墊秷鏉ヨ嚜鍏跺畠澹伴煶婧愮殑澹伴煶錛屾瘮濡傝儗鏅腑鏀墮煶鏈烘斁鍑烘潵鐨勬瓕鏇詫紱
IDirectSoundFullDuplex8* DirectSoundFD;//
IDirectSoundCaptureBuffer8* DirectSoundCaptureBuf8;//鎹曟崏緙撳啿鍖烘帴鍙f寚閽?br />IDirectSoundBuffer8* DirectSoundBuf8;//鍥炴斁緙撳啿鍖烘帴鍙f寚閽?br />IDirectSoundBuffer8* pIUnkown;//鍥炴斁緙撳啿鍖烘帴鍙f寚閽?/p>
extern "C" const GUID GUID_DSCFX_MS_NS = {0x11c5c73b, 0x66e9, 0x4ba1, {0xa0, 0xba, 0xe8, 0x14, 0xc6, 0xee, 0xd9, 0x2d}};
extern "C" const GUID GUID_DSCFX_CLASS_NS = {0xe07f903f, 0x62fd, 0x4e60, {0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5}};
extern "C" const GUID GUID_DSCFX_MS_AEC = {0xcdebb919, 0x379a, 0x488a, {0x87, 0x65, 0xf5, 0x3c, 0xfd, 0x36, 0xde, 0x40}};
extern "C" const GUID GUID_DSCFX_CLASS_AEC = {0xBF963D80L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
extern "C" const GUID DAlgorithm ={0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
//1.鍒涘緩鍙婂垵濮嬪寲DirectSound
WAVEFORMATEX WaveDataFormat={WAVE_FORMAT_PCM, 1,8000,16000,2,16, 0};
//鍥炴斁緙撳啿鍖恒俽ender buffer
DSBUFFERDESC desc;
memset(&desc, 0, sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_GLOBALFOCUS;
desc.dwBufferBytes = 2000 * NUM_REC_NOTIFICATIONS;//寰呭畾
desc.dwReserved = 0;
desc.lpwfxFormat = &WaveDataFormat;
memset(efft, 0, sizeof(efft));
//AEC鏁堟灉
efft[0].dwSize = sizeof(efft[0]);
efft[0].dwFlags = DSCFX_LOCSOFTWARE;
efft[0].guidDSCFXClass = GUID_DSCFX_CLASS_AEC;
efft[0].guidDSCFXInstance = GUID_DSCFX_MS_AEC;
//NS鏁堟灉
efft[1].dwSize = sizeof(efft[1]);
efft[1].dwFlags = DSCFX_LOCSOFTWARE;
efft[1].guidDSCFXClass = GUID_DSCFX_CLASS_NS;
efft[1].guidDSCFXInstance = GUID_DSCFX_MS_NS;
//鎹曟崏緙撳啿鍖恒俢apture buffer
DSCBUFFERDESC cdesc;
memset(&cdesc, 0, sizeof(cdesc));
cdesc.dwSize = sizeof(cdesc);
cdesc.dwFlags = DSCBCAPS_CTRLFX;
cdesc.dwBufferBytes = 2000 * NUM_REC_NOTIFICATIONS;//寰呭畾
cdesc.lpwfxFormat = &WaveDataFormat;
cdesc.dwFXCount = 2;
cdesc.lpDSCFXDesc = efft;
hr = DirectSoundFullDuplexCreate8(0, 0,&cdesc, &desc,win,
DSSCL_PRIORITY,&DirectSoundFD, &DirectSoundCaptureBuf8,&DirectSoundBuf8, 0);
DXTRACE_ERR( TEXT("DirectSoundFullDuplexCreate8"), hr );
//鎴愬姛鍒涘緩DirectSoundFD錛孌irectSoundCaptureBuf8錛孌irectSoundBuf8錛屽潎涓嶄負闆躲?/p>
DirectSoundFD->QueryInterface(IID_IDirectSoundBuffer8, (void**)pIUnkown);
//鍙戠幇涓婇潰鐨刾IUnkown=0錛屾煡璇㈠け璐ワ紝涓轟粈涔堬紵
AfxMessageBox("澶辮觸");
]]>
]]>
void SetImageTransColor( CxImage* pImg, BYTE R, BYTE G, BYTE B )
{
if (pImg == NULL) return;
if (pImg->GetTransIndex() != 24)
{
pImg->IncreaseBpp(24);
}
pImg->SetTransIndex(0);
RGBQUAD rgbTrans = {B, G, R, 0};
pImg->SetTransColor(rgbTrans);
}
]]>
浣嗘槸浜嬪疄涓?鎴戠殑Overlapped閮芥槸澶嶇敤鐨?鍥犳,涓嶅ぇ鍙兘鏄闂瀵艱嚧鐨?緇忚繃嫻嬭瘯璇佹槑,涔熺‘瀹炰笌姝ゆ棤鍏?
鏄ㄦ櫄涓婂張鍋氫簡涓緋誨垪鐨勬祴璇?緇撴灉鍒版渶鍚庝緷鏃ф槸鏃犳灉,鐧捐埇鏃犲涔嬩笅,鍙ソ闂漢,鍚庨潰QQ濂藉弸Sagasarate鍛婅瘔浜嗘垜鍘熷,鎴戠煡閬撲箣鍚?鍙湁涓ょ鎰熻:鎯沖摥,鎯蟲挒澧?![]()
鑷充簬涓轟粈涔?璇風湅浠ヤ笅浠g爜渚跨煡浜?闈炲父闈炲父涔嬩綆綰х殑閿欒.
{
ASSERT(pOverLappedRecv);
if (pOverLappedRecv == NULL) return false;
pOverLappedRecv->Reset();
DWORD dwBytesRecv = 0;
DWORD dwFlags = 0;
int nSenderAddrSize = sizeof (sockaddr_in);
int rc = 0;
rc = ::WSARecvFrom(m_ServerSocket, pOverLappedRecv->GetWsaBuffer(), 1, &dwBytesRecv, &dwFlags,
pOverLappedRecv->GetClientAddr(), &nSenderAddrSize,
pOverLappedRecv->GetOverlapped(), NULL);
if (rc == SOCKET_ERROR)
{
DWORD dwErrorCode = ::WSAGetLastError();
if (dwErrorCode != WSA_IO_PENDING)
{
return false;
}
}
return true;
}
濡傛灉娌$湅鍑烘潵,閭f垜鏉ュ憡璇変綘鏄負浠涔?
闂灝卞湪浜嶹SARecvFrom鐨?涓弬鏁?
MSDN鐨勬弿榪?
濂藉惂,榪欎簨灝辨槸鎴戝共鍑烘潵鐨?浠婂勾绔熸槸鍋氫竴浜涜剳孌嬬殑浜嬫儏.鑲夸箞浜嗘垜榪欐槸.T_T
瑕佽В鍐寵繖涓棶棰?鏈濂界殑鍔炴硶灝辨槸鎶妌SenderAddrSize浣滀負CUdpOverLappedRecv鐨勬垚鍛樺彉閲忎繚瀛?榪欐牱鐢熷懡鍛ㄦ湡鍙互寰椾互淇濊瘉.
濂藉惂,榪欎歡鑴戞畫浜嬪氨榪欎箞緇撲簡.
]]>
__int64 x = av_rescale(m_llframe_index,AV_TIME_BASE*(int64_t)c->time_base.num,c->time_base.den);
if( x > lTimeStamp )
{
return TRUE;
}
m_pVideoFrame2->pts = lTimeStamp;
m_pVideoFrame2->pict_type = 0;
int out_size = avcodec_encode_video( c, m_pvideo_outbuf, video_outbuf_size, m_pVideoFrame2 );
if (out_size > 0)
{
AVPacket pkt;
av_init_packet(&pkt);
if( x > lTimeStamp )
{
pkt.pts = pkt.dts = m_llframe_index;
pkt.duration = 0;
}
else
{
pkt.duration = (lTimeStamp - x)*c->time_base.den/1000000 + 1;
pkt.pts = m_llframe_index;
pkt.dts = pkt.pts;
m_llframe_index += pkt.duration;
}
//pkt.pts = lTimeStamp * (__int64)frame_rate.den / 1000;
if( c->coded_frame && c->coded_frame->key_frame )
{
pkt.flags |= PKT_FLAG_KEY;
}
pkt.stream_index= m_pVideoStream->index;
pkt.data= m_pvideo_outbuf;
pkt.size= out_size;

ret = av_interleaved_write_frame( m_pAvFormatContext, &pkt );
}
else
{
ret = 0;
}
]]>
瀵逛簬windows緋葷粺錛孍VR/VMR9/VMR娓叉煋鍣ㄥ潎鎻愪緵浜嗗彔鍔犻潤鎬佸浘鐗囩殑鎺ュ彛錛?br />SetAlphaBitmap錛堬級錛?br />
姝ゆ帴鍙f敮鎸侀潤鎬佸浘鐗囩殑璧勬簮浣跨敤鏂瑰紡錛屼竴縐嶆槸HDC錛屼竴縐嶆槸SURFACE錛?br />浣跨敤鍙戠幇錛屽鏋滈潤鎬佸浘鐗囦笉瑙勫垯錛屾槸鏈堿lpha閫氶亾鐨勪笉鍚屽彇鍊煎艦鎴愶紝
鍒欓氳繃HDC鍙犲姞鐨勪細鏈夐粦杈瑰瓨鍦紱
瀵逛簬EVR/VMR9鍙噰鐢⊿URFACE錛屼嬌鐢―3D鍒涘緩錛屽畬緹庢按鍗版晥鏋滅浉瀵瑰鏄撳疄鐜幫紝鐣ヨ繃錛?br />瀵逛簬VMR娓叉煋鍣紝SURFACE闇瑕佸熀浜嶥irectDraw鍒涘緩紱誨睆琛ㄩ潰錛?br />
紱誨睆琛ㄩ潰鍒涘緩鍚庯紝闈欐佸浘鐗囨暟鎹嬌鐢ㄥ喅瀹氱潃鏄惁鑳藉畬緹庡憟鐜版按鍗版晥鏋滐紱
涓縐嶆槸閫氳繃紱誨睆琛ㄩ潰鑾峰彇HDC錛屾搷浣淗DC錛屾妸闈欐佸浘鐗囬檮鍔犵粰紱誨睆琛ㄩ潰錛?br />涓縐嶆槸閫氳繃鐩存帴鎿嶄綔紱誨睆琛ㄩ潰鐨勫唴瀛樻暟鎹湴鍧錛?br />
緇忚繃鍑犲ぉ鐨勬懜绱紝瀹炵幇浜嗘瘮杈冨畬緹庣殑姘村嵃鏁堟灉錛屼唬鐮佸涓嬶細
LPDIRECTDRAW7 lpDDraw7;
if(FAILED(DirectDrawCreateEx(NULL, (LPVOID *)&lpDDraw7, IID_IDirectDraw7, NULL)))
{
return ;
}
if (FAILED(lpDDraw7->SetCooperativeLevel(m_hShowWin, DDSCL_NORMAL)))
{
return ;
}
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = xs;
ddsd.dwHeight = ys;
ddsd.ddpfPixelFormat.dwSize =sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags =DDPF_RGB | DDPF_ALPHAPIXELS;
ddsd.ddpfPixelFormat.dwRGBBitCount =32;
ddsd.ddpfPixelFormat.dwRBitMask=0x00ff0000;
ddsd.ddpfPixelFormat.dwGBitMask=0x0000ff00;
ddsd.ddpfPixelFormat.dwBBitMask=0x000000ff;
ddsd.ddpfPixelFormat.dwRGBAlphaBitMask=0xff000000;
if(FAILED(lpDDraw7->CreateSurface(&ddsd, lpSource, NULL)))
{
return ;
}
lpSurface->Restore();
CImage img;
HRESULT result;
result = img.Load(_bstr_t(path));
if(!SUCCEEDED(result))
return ;
LPBYTE lpBits = (LPBYTE)img.GetBits();
int nPitch = img.GetPitch();
int imgWidth = img.GetWidth();
int bpp = img.GetBPP();
if(bpp != 24 && bpp != 32)
return ;
DDSURFACEDESC2 dds;
ZeroMemory(&dds,0,sizeof(dds));
dds.dwSize = sizeof(dds);
if(DD_OK != lpSurface->Lock(NULL, &dds, DDLOCK_WAIT, NULL))
return;
LPBYTE dest = (LPBYTE)dds.lpSurface;
for( int yPos = 0; yPos < img.GetHeight(); yPos++)
{
LPBYTE lpBytes = lpBits + ( yPos * nPitch );
int width = img.GetWidth( ) * (bpp / 8);
for( int xPos = 0; xPos < width; )
{
if(bpp == 24)
{
*dest++ = lpBytes[xPos ];
*dest++ = lpBytes[xPos + 1];
*dest++ = lpBytes[xPos + 2];
*dest++ = 0xff;
xPos += 3 ;
}
else if(bpp == 32)
{
*dest++ = lpBytes[xPos];
xPos ++;
}
}
dest += dds.lPitch - width;
}
lpSurface->Unlock(NULL);
]]>
閿欒涓猴細
strmbase.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (g_Templates@@3PAVCFactoryTemplate@@A)
strmbase.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (g_cTemplates@@3HA"g_cTemplates@@3HA)
鍘熷洜濂藉儚鍑哄湪鏍囧噯C涓婏紝涓庣敤鎴蜂唬鐮佹棤鍏熾?/span>
----------------------------瑙e喅鏂規--------------------------------------
鍔犲叆涓嬮潰鍔犱笂浠ヤ笅浠g爜,閲嶆柊緙栬瘧鍗沖彲.
銆銆/////////////////////////////////////////////////////////////////////////////
銆銆// DllGetClassObject
銆銆extern "C"
銆銆STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
銆銆{
銆銆AFX_MANAGE_STATE(AfxGetStaticModuleState());
銆銆return AfxDllGetClassObject(rclsid, riid, ppv);
銆銆}
銆銆/////////////////////////////////////////////////////////////////////////////
銆銆// DllCanUnloadNow
銆銆extern "C"
銆銆STDAPI DllCanUnloadNow(void)
銆銆{
銆銆AFX_MANAGE_STATE(AfxGetStaticModuleState());
銆銆return AfxDllCanUnloadNow();
銆銆}
銆銆////////////////////////////////////////////////////////////////////////////
]]>
]]>
* Copyright (C) 2008 - - All Rights Reserved
*
* 鏂囦歡鍚嶇О: IOCP.h
* 鎽?nbsp; 瑕? IOCP鍖呰9綾?br />*
* 浣?nbsp; 鑰? yanglinbo,
* 淇?nbsp; 鏀? 鏌ョ湅鏂囦歡鏈涓嬫柟.
*
***********************************************************************/
#ifndef __IOCP_H__
#define __IOCP_H__
#include <assert.h>
#include <WinSock2.h>
//////////////////////////////////////////////////////////////////////////
/// IOCP鍖呰綾伙紝瀹屾垚IOCP鍒涘緩錛屽叧鑱旂瓑鍔ㄤ綔
//////////////////////////////////////////////////////////////////////////
class CIOCP
{
public:
CIOCP(int nMaxConcurrency = -1);
virtual ~CIOCP(void);
CIOCP& operator = (const CIOCP& rht);
CIOCP& operator = (const HANDLE& rht);
operator HANDLE() const;
/// 鍒涘緩IOCP
/// @param [in] nMaxConcurrency 鏈澶х嚎紼嬫暟
BOOL Create(int nMaxConcurrency);
/// 閿姣両OCP
BOOL Destroy();
/// 瀹屽叏绔彛鏄惁鏈夋晥
BOOL IsValid() const;
/// 鍏寵仈鎸囧畾SOCKET鍙婂弬鏁板埌IOCP
/// @param [in] socket
/// @param [in] CompKey
BOOL AssociateSocket(SOCKET socket, ULONG_PTR CompKey);
/// 鍙戦侀氱煡鍒癐OCP
/// @param [in] CompKey
/// @param [in] dwNumBytes
/// @param [in] po
BOOL PostStatus(ULONG_PTR CompKey, DWORD dwNumBytes = 0, OVERLAPPED* po = NULL);
/// 鍙栧緱IOCP鐘舵?br /> /// @param [in] pCompKey
/// @param [in] pdwNumBytes
/// @param [in] ppo
/// @param [in] dwMilliseconds
BOOL GetStatus(ULONG_PTR* pCompKey, PDWORD pdwNumBytes, OVERLAPPED** ppo, DWORD dwMilliseconds = INFINITE);
private:
HANDLE m_hIOCP; ///< IOCP鍙ユ焺
};
#endif
cpp鏂囦歡錛?br />
/**********************************************************************
* Copyright (C) 2008 - - All Rights Reserved
*
* 鏂囦歡鍚嶇О: IOCP.cpp
* 鎽?nbsp; 瑕? IOCP鍖呰9綾?br />
*
* 浣?nbsp; 鑰? yanglinbo,
* 淇?nbsp; 鏀? 鏌ョ湅鏂囦歡鏈涓嬫柟.
*
***********************************************************************/
#include "StdAfx.h"
#include "IOCP.h"

CIOCP::CIOCP( int nMaxConcurrency /*= -1*/ )
: m_hIOCP(INVALID_HANDLE_VALUE)
{
if (nMaxConcurrency != -1)
{
Create(nMaxConcurrency);
}
}
CIOCP::~CIOCP( void )
{
Destroy();
}
CIOCP& CIOCP::operator=( const CIOCP& rht )
{
m_hIOCP = rht.m_hIOCP;
return *this;
}
CIOCP& CIOCP::operator=( const HANDLE& rht )
{
m_hIOCP = rht;
return *this;
}
CIOCP::operator HANDLE() const
{
return (HANDLE)(this == NULL ? NULL : m_hIOCP);
}
BOOL CIOCP::Create( int nMaxConcurrency )
{
m_hIOCP = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nMaxConcurrency);
ASSERT(IsValid());
return IsValid();
}
BOOL CIOCP::Destroy()
{
if (IsValid() == FALSE) return TRUE;
BOOL bClosed = ::CloseHandle(m_hIOCP);
m_hIOCP = INVALID_HANDLE_VALUE;
return bClosed;
}
BOOL CIOCP::AssociateSocket( SOCKET socket, ULONG_PTR CompKey )
{
ASSERT(IsValid());
if ( IsValid() == FALSE ) return FALSE;
return (::CreateIoCompletionPort((HANDLE)socket, m_hIOCP, CompKey, 0) == m_hIOCP);
}
BOOL CIOCP::PostStatus( ULONG_PTR CompKey, DWORD dwNumBytes /*= 0*/, OVERLAPPED* po /*= NULL*/ )
{
ASSERT(IsValid());
if ( IsValid() == FALSE ) return FALSE;
return ::PostQueuedCompletionStatus(m_hIOCP, dwNumBytes, CompKey, po);
}
BOOL CIOCP::GetStatus( ULONG_PTR* pCompKey, PDWORD pdwNumBytes, OVERLAPPED** ppo, DWORD dwMilliseconds /*= INFINITE*/ )
{
ASSERT(IsValid());
if ( IsValid() == FALSE ) return FALSE;
return ::GetQueuedCompletionStatus(m_hIOCP, pdwNumBytes, pCompKey, ppo, dwMilliseconds);
}
BOOL CIOCP::IsValid() const
{
return (m_hIOCP != NULL) && (m_hIOCP != INVALID_HANDLE_VALUE);
}
]]>
1.灞忚斀WM_ERASEBKGND娑堟伅
BOOL CMyListCtrl::OnEraseBkgnd(CDC * pDC)
{
return FALSE;
}
2.鍦╓M_PAINT娑堟伅涓?font color="#333333">浣跨敤鑷凡鐨勫弻緙撳瓨
void CMyListCtrl::OnPaint()
{
CPaintDC dc(this);
CRect rcClient,rcClip,rcHeader;
GetClientRect(&rcClient);
GetHeaderCtrl()->GetWindowRect(&rcHeader);
dc.GetClipBox(&rcClip);
CDC MemDC;
CBitmap MemBitmap, *pOldBitmap;
MemDC.CreateCompatibleDC(&dc);
int nMode = MemDC.SetMapMode(dc.GetMapMode());
MemBitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
pOldBitmap = MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(&rcClient,GetBkColor());
CRgn rgn;
rgn.CreateRectRgn(rcClip.left,rcClip.top,rcClip.right,rcClip.bottom);
MemDC.SelectClipRgn(&rgn);
DefWindowProc(WM_PAINT,(WPARAM)MemDC.m_hDC,(LPARAM)0);
MemDC.SelectClipRgn(NULL);
if (rcClip.top < rcHeader.Height())
rcClip.top = rcHeader.Height();
dc.BitBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),&MemDC,rcClip.left,rcClip.top,SRCCOPY);
MemDC.SetMapMode(nMode);
MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
MemBitmap.DeleteObject();
rgn.DeleteObject();
}
]]>