《QQ视频语音原码_0.docx》由会员分享,可在线阅读,更多相关《QQ视频语音原码_0.docx(13页珍藏版)》请在优知文库上搜索。
1、QQ视频语音原码QQ视频语音原码用DirectShow实现QQ的音视频闲聊功能开发者在线Builder更新时间:2007T0T7作者:才智的鱼来源:天极网本文关健词:DirectShowQQ音视频闲聊当下比较流行的即时通信工具,比如MSN,QQ等都实现了视音频的功能,通过视频,音频,我们可以更好的和挚友通过网络进行沟通,本文通过DirectShow技术模拟QQ实现了视频和音频的采集,传输,基本实现了QQ的视音频闲聊的功能。网络视音频系统主要功能就在于视音频的采集,网络传输两个方面,通过VideoCapture系列APl函数,你就可以轻松的搞定视频捕获,但是对于视频的网络传输,则要费一番功夫了。
2、对于视音频数据的传输,只简洁地运用数据报套接字传输音视频数据是不行行的,还必需在UDP层上采纳RTP(实时传输协议)和RTCP(实时传输限制协议)来改善服务质量。实时传输协议供应具有实时特征的、端到端的数据传输服务。我们在音视频数据前插入包含有载荷标识、序号、时间戳和同步源标识符的RTP包头,然后利用数据报套接字在IP网络上传输RTP包,以此改善连续重放效果和音视频同步。实时传输限制协议RTCP用于RTP的限制,它最基本的功能是利用发送者报告和接收者报告来推断网络的服务质量,若拥塞状况严峻,则改用低速率编码标准或降低数据传输比特率,以削减网的RTP包,这个filter有一个或者多个输出的pin
3、。这个Filter供应了如何限制多路分别和如何安排到特定输出Pin的接口。RTPRPHFilter是用来网络过来的RTP包还原成原来的数据格式,主要支持H.261,H.263,Indeo,G.711,G.723和G.729和常见的多种音视频负载类型。RTPSPHfilter则和RPHfilter的功能相对,它的任务是将音视频压缩filter输出的数据分解为RTP包,它供应的接口有指定最大生成包大小和Pt值。下面我们看看如何用这些filter来搭建我们采集和传输的graph图。图1和图2展示了DirectShowRTP中定义的filters如何运用。图1是一个采集本地多媒体数据并运用RTP协议通
4、过网络发送的filtergraph0它包含一个输出原始视频帧的视频采集filter,紧跟一个压缩帧的编码filter。一旦压缩,这些帧就会被发送到RTPSPHfiIter,分片打包,生成RTP包,对应的发送到RTPRenderfilter,通过网络传输这些包。图2呈现了一个filtergraph,用来接收包含视频流RTP包,播放视频。HcpVideoCapGraphBuiIder;CComPtrIBaseFilterm_pFi1terVideoCap;CComPtrIVideoWindowm_pVidcoWindow;CComPtrIMediaControlm_pVideoMediaCtr1:
5、CComPtrIBaseFilterm_pVideoRcnderFi1ter:!RESU1.TCMyDialog:IVideoGraphInitAndSendOHRESU1.Thr;hr=m_pVidcoGraphBui1tier.CoCreatcInstance(C1.SID_FiItcrGraph);if(FAI1.ED(hr)returnhr:hr=m_pVideoCapGraphBui1der.CoCreateInstance(C1.SID_CapturcGraphBui)dcr2);if(FAI1.ED(hr)returnhr;m_pVideoCapGraphBuiIder-SetF
6、i1Iergraph(m_pVidcoGraphBui1dor);m_pVidcoGraphBui1der-QucryInterface(IID_IMediaControl,(void*)m_pVideoMediaCtr1);m_pVidcoGraphBuiIder-QucryInterface(IID_IVideoWindow,(void*)m_pVideoWindow)FindDeviceFiIter(m_pFiIterVidcoCap,C1.siD-VideolnputDeviceCategory);if(m_pFi1terVideoCap)m_pVidcoGraphBuilder-Ad
7、dFilter(m_pFi1terVideoCap,T2W(VideoCap);创建预览的filterhr=m_pRenderFi1terVidoo.CoCreaIeInstancc(C1.SID_VidcoRcnderer);if(FAI1.ED(hr)returnhr;pRenderOption);m_pVideoRtpRender-QueryInterface(11DVideo0ption,(voicl*)pVideoOption);pVideo0ption-SetProperty(vif);pVideo0ption-SetSendFrameRate(m_iFrameRate,1);/1
8、不发送数据,0实际发送数据ConnCCtGn_pFiIterVideoCap,m_pVideoRtpRender);连接对方hr=PRenderOption-Connect(szClientA,iVideoPort,1024);if(FAI1.ED(hr)returnhr;m_pVideoMediaCtrI-RunO;视频的接收CComPtrIGraphBuiIderm_pVideoGraphBui1dcr:视频图形管理器CComPtrIBaseFilterm_pFi11erVideoCap;CComPtrIVideoWindowm_pVideoWindow;CComPtrIMediaCont
9、rolm_pVideoMediaCtr1;CComPtrIBaseFilterm_pVideoRenderPliter;HWNDm_hRcnderWnd;!RESU1.TVideoReciveO(HRESU1.Thr;hr=CoCreateInstance(C1.SID_FilteGraph,NU1.1.,C1.SCTX_INPROC,IID_IFilterGraph,(void*)m_pVideoGraphBui1tier);m_pVideoGraphBui1der-QueryInterface(I11)-IMediaControl,(void*)m_pVideoMediaCtr1);m_p
10、VideoGraphBui1der-QucryInterface(11D_IVidCONindow,(void*)m_pVideoWindow)hr:CoCreateInsta11ce(C1.SID_FH263Source,NU1.1.,C1.SCTX_1NPROC,IIDBaSeFilter,(void*)i1.eft=(iWidth-tmpiWidth)/2;iWidth=tmpiWidth;iTop=0:m_pVideoWindow-put_Owner(O.HWND)m_hRcnderWnd);m_pVideoWindow-put_Visible(OATRUE);m_pVideoWind
11、ow-put_WindowSty1e(WS_CHI1.DWS_C1.IPSIB1.INGS);m_pVideoMediaCIrI-Run0;returnS_OK:/HRESU1.TFindDeviceFi1ter(IBaseFi1ter*PpSrcFilter,GUIDdeviceGUID)HRESU1.Thr:IBaseFilter*pSrc=NU1.1.;CComPtrIMonikerpMoniker=NU1.1.;U1.ONGcFetched;if(JppSrcFiIter)returnE_POINTER;/CreatethesystemdeviceenumeratorCComPtrIC
12、reatcDevEnunip)cvEnum=NU1.1.;hr=CoCreateInstance(C1.SD.SystemDeviceEnum,NU1.1.,C1.SCTX.INPROC,IID_ICreateDevEnum,(void*)pDerE11um);if(FAI1.ED(hr)returnhr;/CreateanenumeratorforthevideocapturedevicesCComPtrIEnumMonikerpClassEnum=NU1.1.;hr=PDevEnuin-CreateClassEnumerator(deviceGUID,pClassEnum,O);if(FA
13、I1.ED(hr)returnhr;if(pClassEnum=NU1.1.)returnE_FAI1.;if(S_OK=(pClassEnum-Next(1,pMoniker,cFetched)hr=PMoniker-BindToObject(O,O,IID_IBaseFiIter,(void*)pSrc);if(FI1.ED(hr)returnhr;elsereturnE_FAI1.;*ppSrcFi1ter=pSrc;returnS_OK;构建音频Graph图,并发送CComPtrIGraphBuiIdcrmpAudioGraphBui1der;音频图形管理器CComPtrICaptur
14、eGraphBuilder2m_pCapAudioGraphBui1der;CComPtrIBaseFilterm_pFi1terAudioCap;CComPtrIMediaControlm_pAudioMediaCtrl;HRESU1.TAudioGraphInitOHRESU1.Thr;hr=m-pudioGraphBui1der.CoCreateInstance(C1.SID_FiIterGraph);if(FAI1.ED(hr)returnhr:hr=m_pCapAudioGraphBui1der.CoCreateInstance(C1.SID-CaptureGraphBuilder2
15、);if(FAI1.ED(hr)returnhr:m-pudioGraphBuiIder-SetFiItergraph(m-pCapudioGraphBui1der);m_pAudioGraphBuiIder-QueryInterface(IID_IMediaControl,(void*)m_pAudioMediaCtr1);FindDeviceFi1ter(m_pFi11erVideoCap,C1.STD_AudioInputDeviceCategory);if(m_pFiIIerAudioCap)m_pAudioGraphBu1.lder-AddFilter(m_pFi1terudioCap,T2W(AudioCap);发送到网络hr=:CoCreateInstance(C1.SlD_FG729Render,NU1.1.,C1.SCTX_INPROC,IIDJBaseFilter,(void*)m_pFiIterRtpSendAudio)if(FAI1.ED(hr)returnhr:m_pAudIoGraphBuiIdcr-AddFi1ter(m_pAudioRtpRcndcr,1.FilterRtpSendAudio);Connec