欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
開(kāi)發(fā)基于P2P技術(shù)開(kāi)發(fā)視頻會(huì )議軟件相關(guān)主要技術(shù)
一、 引言

我相信多數人聽(tīng)說(shuō)過(guò)微軟的NetMeeting,甚至有人直接使用過(guò);而如今,眾多的網(wǎng)蟲(chóng)沉迷于視頻聊天。這類(lèi)軟件是怎樣開(kāi)發(fā)出來(lái)的呢?本文中,讓我們來(lái)共同剖析開(kāi)發(fā)基于P2P技術(shù)開(kāi)發(fā)視頻會(huì )議軟件相關(guān)的主要技術(shù),并給出一個(gè)簡(jiǎn)明的例子。本示例應用程序允許LAN/Intranet上的任何兩個(gè)人舉行視頻會(huì )議。

憑直覺(jué)我們就會(huì )知道,開(kāi)發(fā)這一類(lèi)軟件所涉及的主要問(wèn)題,就是視頻幀的大尺寸將極大地影響數據的傳輸質(zhì)量。因而,這類(lèi)軟件的性能也主要依賴(lài)于視頻幀編碼和解碼的質(zhì)量。為此,在本例中,我們選用的是較快速的H.263編碼器庫,該庫具有相當好的壓縮比率,從而有效地克服了我們在圖像傳輸中的速度矛盾。

請注意,有興趣的讀者可稍微修改本文中的示例程序以應用于因特網(wǎng)環(huán)境中。

二、 音頻的錄制與播放問(wèn)題

這一部分的開(kāi)發(fā)相對簡(jiǎn)單。其一,這種功能的API從Windows 3.1開(kāi)始就已經(jīng)提供(winmm.lib+mmsystem.h);其二,如今借助于方便的因特網(wǎng),我們完全可以搜到現成的包裝類(lèi)。在本文中,我們直接借用了提供了兩個(gè)現成的RecordSound與PlaySound類(lèi)。這兩個(gè)類(lèi)都派生于CWinThread類(lèi),用戶(hù)可以“死搬硬套”地使用它們。下面代碼展示了這兩個(gè)類(lèi)的使用,具體包裝類(lèi)定義請參考下載源碼文件。

//創(chuàng )建并啟動(dòng)錄音線(xiàn)程

record=new RecordSound(this);

record->CreateThread();

//創(chuàng )建并啟動(dòng)播放線(xiàn)程

play=new PlaySound1(this);

play->CreateThread();

//開(kāi)始錄制

record->PostThreadMessage(WM_RECORDSOUND_STARTRECORDING,0,0);

//開(kāi)始播放

play->PostThreadMessage(WM_PLAYSOUND_STARTPLAYING,0,0);

//在音頻錄制期間,我們可以在RecordSound類(lèi)的OnSoundData

//回調函數中使用這些數據。在此,你可以放置你要發(fā)送到遠程宿主的數據……

//播放接收自遠程宿主的音頻數據

play->PostThreadMessage(WM_PLAYSOUND_PLAYBLOCK,size,(LPARAM) data);

//停止錄制

record->PostThreadMessage(WM_RECORDSOUND_STOPRECORDING,0,0);

//停止播放

play->PostThreadMessage(WM_PLAYSOUND_STOPPLAYING,0,0);

//最后,停止錄音線(xiàn)程

record->PostThreadMessage(WM_RECORDSOUND_ENDTHREAD,0,0);

//停止播放線(xiàn)程

play->PostThreadMessage(WM_PLAYSOUND_ENDTHREAD,0,0);

上面已經(jīng)加了注釋?zhuān)褂梅椒ㄒ荒苛巳弧?br>
三、 視頻捕獲的問(wèn)題

當前,在Windows平臺下開(kāi)發(fā)視頻應用一般采用兩種方案。一種是基于視頻采集卡所附帶的二次軟件開(kāi)發(fā)包SDK進(jìn)行。此方式的優(yōu)點(diǎn):幫助資料齊全,直接套用現成的API,易于上手;但缺點(diǎn)也是明顯的:硬件依賴(lài)性強,缺乏應有的靈活性,因此,不能充分滿(mǎn)足開(kāi)發(fā)通用的視頻應用的需要。

另一種方案是基于微軟公司的VFW(Video for Windows)進(jìn)行。這個(gè)SDK為開(kāi)發(fā)Windows平臺下的視頻應用程序提供也現成的軟件工具包(一組API),開(kāi)發(fā)人員可以通過(guò)它們很方便地實(shí)現視頻捕獲、視頻編輯及視頻播放功能,特別是可利用其中內置的回調函數開(kāi)發(fā)出更為復雜的視頻應用程序。因此,這種方案的優(yōu)點(diǎn)是播放視頻時(shí)不需要專(zhuān)用的硬件設備(大多數的視頻采集卡驅動(dòng)程序都支持VFW接口),應用靈活,可以滿(mǎn)足視頻應用程序開(kāi)發(fā)的需要。值得慶幸的是,如今的Windows版本都內置安裝了VFW相關(guān)組件,而VC++自4.0以來(lái)就支持VFW,從而大大簡(jiǎn)化了視頻應用程序的開(kāi)發(fā)。目前,基于PC的多媒體應用程序的視頻部分,大都是利用VFW API開(kāi)發(fā)的。

VFW以消息驅動(dòng)方式實(shí)現對視頻設備進(jìn)行訪(fǎng)問(wèn),便于開(kāi)發(fā)者控制設備數據流的工作過(guò)程。簡(jiǎn)言之,這個(gè)框架主要包括VICAP.DLL、MSVIDEO.DLL、MCIAVI.DRV、AVIFILE.DLL、ICM、ACM等多個(gè)動(dòng)態(tài)連接庫,這些組件協(xié)同合作,共同完成視頻的捕獲、視頻壓縮及播放功能。有關(guān)這些模塊的具體介紹見(jiàn)MSDN,在此略過(guò)。

(一)視頻捕獲

視頻數據的實(shí)時(shí)采集,主要通過(guò)AVICAP模塊中的消息、宏函數、結構以及回調函數來(lái)完成。視頻捕獲的大致過(guò)程如下:

(1)建立捕獲窗口

利用函數capCreateCaptureWindow()建立視頻捕獲窗口,它是所有捕獲工作及設置的基礎。其主要功能包括:①動(dòng)態(tài)地同視頻和音頻輸入器連接或斷開(kāi);②設置視頻捕獲速率;③提供視頻源、視頻格式以及是否采用視頻壓縮的對話(huà)框;④設置視頻采集的顯示模式為Overlay或為Preview;⑤實(shí)時(shí)獲取每一幀視頻數據;⑥將一視頻流和音頻流捕獲并保存到一個(gè)AVI文件中;⑦捕獲某一幀數字視頻數據,并將單幀圖像以DIB格式保存;⑧指定捕獲數據的文件名,并能將捕獲的內容拷貝到另一文件。

(2)登記回調函數

登記回調函數用來(lái)實(shí)現用戶(hù)的一些特殊需要。在以一些實(shí)時(shí)監控系統或視頻會(huì )議系統中,需要將數據流在寫(xiě)入磁盤(pán)以前就必須加以處理,達到實(shí)時(shí)功效。應用程序可用捕獲窗來(lái)登記回調函數,以便及時(shí)處理以下情況:捕獲窗狀態(tài)改變、出錯、使用視頻或音頻緩存、放棄控制權等,相應的回調函數分別為capStatusCallback(),capErrorCallback(),
capVideoStreamCallback(),capWaveStreamCallback(),capYieldCallback()。

(3)獲取捕獲窗口的缺省設置

通過(guò)宏capCaptureGetSetup(hWndCap,&m_Parms,sizeof(m_Parms))來(lái)完成。

(4)設置捕獲窗口的相關(guān)參數

通過(guò)宏capCaptureSetSetup(hWndCap,&m_Parms,sizeof(m_Parms))來(lái)完成。

(5)連接捕獲窗口與視頻捕獲卡

通過(guò)宏capDriveConnect(hWndCap,0)來(lái)完成。

(6)獲取采集設備的功能和狀態(tài)

通過(guò)宏capDriverGetCaps(hWndCap,&m_CapDrvCap,sizeof(CAPDRIVERCAPS))來(lái)獲取視頻設備的能力,通過(guò)宏capGetStatus(hWndCap,&m_CapStatus,sizeof(m_CapStatus))來(lái)獲取視頻設備的狀態(tài)。

(7)設置捕獲窗口顯示模式

視頻顯示有Overlay(疊加)和Preview(預覽)兩種模式。在疊加模式下,捕獲視頻數據布展系統資源,顯示速度快,視頻采集格式為YUV格式,可通過(guò)capOverlay(hWndCap,TRUE)來(lái)設置;預覽模式下要占用系統資源,視頻由系統調用GDI函數在捕獲窗顯示,顯示速度慢,它支持RGB視頻格式。

(8)捕獲圖像到緩存或文件并作相應處理

若要對采集數據進(jìn)行實(shí)時(shí)處理,則應利用回調機制,由capSetCallbackOnFrame(hWndCap,FrameCallbackProc)完成單幀視頻采集;由capSetCallbackOnVideoStream(hWndCap,VideoCallbackProc)完成視頻流采集。如果要保存采集數據,則可調用capCaptureSequence(hWnd);要指定文件名,可調用capFileSetCapture(hwnd,Filename)。

(9)終止視頻捕獲斷開(kāi)與視頻采集設備的連接

調用capCatureStop(hWndCap)停止采集,調用capDriverDisconnect(hWndCap),斷開(kāi)視頻窗口與捕獲驅動(dòng)程序的連接。

由于上面這些API密切相關(guān),所以為了使用方便,我們干脆把它們打包到一個(gè)視頻捕獲類(lèi)VideoCapture中。

下面的代碼片斷展示了這個(gè)類(lèi)的使用思路:

//創(chuàng )建視頻捕獲類(lèi)的實(shí)例

vidcap=new VideoCapture();

//當幀捕獲完成時(shí),下面這一句將用于調用主對話(huà)框類(lèi)的顯示函數

vidcap->SetDialog(this);

//下一行完成初始化工作:連接到驅動(dòng)程序;設置使用的視頻格式等。

//如果成功地連接到視頻捕獲設備返回TRUE。

vidcap-> Initialize();

//如果連接成功,那么,我們就可以得到與視頻格式相關(guān)的BITMAPINFO

//結構。后面將用之顯示捕獲的幀

this->m_bmpinfo=&vidcap->m_bmpinfo;

//現在,你可以正式開(kāi)始視頻捕獲了……

vidcap->StartCapture();

//一旦捕獲開(kāi)始,捕獲的幀將到達回調函數—VideoCapture類(lèi)的OnCaptureVideo函數。

//在此回調函數中,你可以調用顯示函數實(shí)現幀顯示(見(jiàn)下一節)

//停止捕獲

vidcap->StopCapture();

//成功捕獲后,釋放視頻捕獲類(lèi)

vidcap->Destroy();

【注意】為了順利編譯和鏈接,你需要在類(lèi)實(shí)現文件(VideoCapture.cpp)的前面加上如下語(yǔ)句:

#pragma comment(lib,"vfw32")

#pragma comment(lib,"winmm")

(二)顯示捕獲的視頻幀

對于顯示捕獲的視頻幀方面(也就是顯示圖像的問(wèn)題),顯然存在多種方案。例如,我們可以使用SetDIBitsToDevice()方法實(shí)現直接顯示捕獲的視頻幀。但是,這種方案速度非常慢,因為它是基于圖形設備接口(GDI)的函數。相比之下,更好一些的方法是使用DrawDib API來(lái)繪制幀,因為這個(gè)函數可以直接寫(xiě)向視頻內存,因此能夠提供更好的性能。

下面的代碼片斷展示了如何使用DrawDib函數顯示捕獲的視頻幀:

//初始化DIB以便繪制

HDRAWDIB hdib=::DrawDibOpen();

//然后,使用適當的參數調用這個(gè)函數……

::DrawDibBegin(hdib,...);

//現在,已經(jīng)作好準備—可以調用這個(gè)函數進(jìn)行幀顯示了

::DrawDibDraw(hdib,...);

//最后,結束幀繪制

::DrawDibEnd(hdib);

::DrawDibClose(hdib);

其實(shí),上面代碼非常類(lèi)似普通位圖繪制過(guò)程。

四、 選擇適當的編碼/解碼庫

在本文中,我們選用Roalt Aalmoes的開(kāi)源的快速H.263編碼器庫。

(一) 使用編碼器代碼示例

//初始化壓縮器

CParam cparams;

cparams.format = CPARAM_QCIF;

InitH263Encoder(&cparams);

//如果你需要從RGB24轉換到YUV420格式,那么應該調用下面的函數

InitLookupTable();

//創(chuàng )建回調函數

//OwnWriteFunction是編碼期間返回編碼數據時(shí)調用的全局函數

WriteByteFunction = OwnWriteFunction;

//壓縮數據必須使用YUV420格式

//在壓縮之前調用下面這個(gè)方法

ConvertRGB2YUV(IMAGE_WIDTH,IMAGE_HEIGHT,data,yuv);

//壓縮幀……

cparams.format=CPARAM_QCIF;

cparams.inter = CPARAM_INTRA;

cparams.Q_intra = 8;

cparams.data=yuv; //數據是YUV格式

CompressFrame(&cparams, &bits);

//你可以從開(kāi)始時(shí)你已經(jīng)注冊的回調函數中取得壓縮的數據

//最后,終止編碼器

// ExitH263Encoder();

(二) 解碼器編程

注意,原始的H.263編碼器庫以C方式進(jìn)行編碼,而且提供了其它更多的細節實(shí)現。在本文中,我們以C++重新進(jìn)行了改寫(xiě)。

下面是解碼器的使用示例代碼框架:

//初始化解碼器

InitH263Decoder();

//解壓幀……

//rgbdata必須足夠大以便存儲輸出數據;

//解碼器以YUV420格式生成圖像數據;

//解碼之后,把它再轉換成RGB24格式……

DecompressFrame(data,size,rgbdata,buffersize);

//最后一步,終止解碼器

ExitH263Decoder();

五、 運行應用程序

為了試驗本文示例應用程序,你應該把可執行文件復制到一個(gè)LAN中的兩臺不同的機器上;然后,分別運行之。從一臺機器上選擇“連接”菜單項,并在彈出對話(huà)框內輸入另一臺機器的名字或IP地址,最后點(diǎn)擊“連接”按鈕。此時(shí),在另一臺機器上應該彈出一個(gè)“接受/拒絕”的對話(huà)框窗口,點(diǎn)擊“接受”按鈕。之后,在第一臺機器上將顯示通知對話(huà)框。按“OK”即可開(kāi)始你的視頻會(huì )議(聊天……)了。

六、 小結

我想通過(guò)本文向讀者強調如下問(wèn)題:Windows平臺下的音頻及視頻開(kāi)發(fā)并非那么復雜高深;有了本文的基礎,你也完全可以據需要開(kāi)發(fā)出自己的視頻會(huì )議、實(shí)時(shí)監控系統、視頻聊天等軟件;另外,本文介紹的技術(shù)也可經(jīng)修改并應用于因特網(wǎng)平臺上。

同時(shí),我們還看到微軟的數字視頻處理軟件開(kāi)發(fā)包Video for Windows的確為我們幫了大忙,而借助于因特網(wǎng)上的開(kāi)源多媒體包能更快地加快這類(lèi)軟件的開(kāi)發(fā)。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
基于VFW的視頻應用程序開(kāi)發(fā)
基于VFW的視頻監控系統
WindowMobile視頻會(huì )議程序的開(kāi)發(fā)
windows的消息隊列與消息循環(huán)
PostMessage(異步)和SendMessage(同步)的區別
模態(tài)消息循環(huán)會(huì )吃掉線(xiàn)程消息
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久