




已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
天津大學(xué)網(wǎng)絡(luò)教育學(xué)院??飘厴I(yè)論文基于Delphi的聊天軟件設(shè)計(jì)摘要:目前網(wǎng)上視頻聊天軟件、視頻會議軟件、可視IP電話軟件隨處可見,你是否想自己做一個玩玩?其實(shí)這類軟件無非是視頻加上網(wǎng)絡(luò)而建成的。如果熟悉視頻捕捉和網(wǎng)絡(luò)傳輸技術(shù),根本就難不倒你。微軟為軟件開發(fā)人員提供了一個專門用于視頻捕捉的VFW SDK(Video for Windows SDK),用它實(shí)現(xiàn)視頻捕捉很簡單,至于網(wǎng)絡(luò)傳輸嘛,Delphi更是提供了N多種網(wǎng)絡(luò)組件,隨你用了。本文詳細(xì)介紹了如何利用Delphi中開發(fā)視頻聊天軟件,同時給出了兩個程序示例。 關(guān)鍵詞:Delphi VFW 視頻 視頻會議 視頻聊天 Video for Windows 一、引言我們知道視頻聊天軟件的關(guān)鍵技術(shù)在于采集視頻,并實(shí)時傳輸給聊天軟件在線的人。對于視頻的采集,這里采用微軟公司的關(guān)于數(shù)字視頻的一個軟件包VFW(Video for Windows)。相信很多人對它都很熟習(xí),VFW能使應(yīng)用程序通過數(shù)字化設(shè)備從傳統(tǒng)的模擬視頻源得到數(shù)字化的視頻剪輯,VFW的一個關(guān)鍵思想是播放時不需要專用硬件。為了解決數(shù)字視頻數(shù)據(jù)量大的問題,需要對數(shù)據(jù)進(jìn)行壓縮,而VFW引進(jìn)了AVI的文件標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)未規(guī)定如何對視頻進(jìn)行捕捉、壓縮及播放,僅規(guī)定視頻和音頻該如何存儲在硬盤上及在AVI文件中交替存儲視頻幀和與之相匹配的音頻數(shù)據(jù)。通過VFW,開發(fā)人員通過發(fā)送消息或設(shè)置屬性來捕捉、播放和編輯視頻剪輯。當(dāng)用戶在安裝VFW時,安裝程序會自動地安裝配置視頻所需要的組件,如設(shè)備驅(qū)動程序、視頻壓縮程序等。VFW主要由6個模塊組成。VFW功能模塊:AVICAP.DLL 包含執(zhí)行視頻捕捉的函數(shù),它給AVI文件的I/O處理和視頻、音頻設(shè)備驅(qū)動程序提供一個高級接口 MSVIDEO.DLL 包含一套特殊的DrawDib函數(shù),用來處理屏幕上的視頻操作 MCIAVI.DRV 包括對VFW的MCI命令解釋器的驅(qū)動程序 AVIFILE.DLL 包含由標(biāo)準(zhǔn)多媒體I/O(mmio)函數(shù)提供的更高的命令,用來訪問.AVI文件 ICM 壓縮管理器,用于管理的視頻壓縮/解壓縮的編譯碼器(Codec) ACM 音頻壓縮管理器,提供與ICM相似的服務(wù),適用于波形音頻 對于視頻的傳輸,我們使用UDP來傳,因?yàn)閁DP傳輸速度快,TCP是面向連接的,建立連接時雙方需經(jīng)過三次握手,數(shù)據(jù)傳輸可靠,F(xiàn)TP、telnet等就是基于TCP的,UDP是面向非連接的,發(fā)出信息不需對方確認(rèn),但這樣速度比TCP快,但有可能丟失數(shù)據(jù),象SMTP、tftp等就是基于UDP的。另外UDP還支持廣播,UDP廣播兩種,一種是directed broadcast,比如你的網(wǎng)段是192.168.0.X,你就往55發(fā)就可以了。另一種是limited broadcast,廣播地址是55二、視頻聊天軟件的開發(fā)步驟2.1 創(chuàng)建捕捉窗口,采集視頻在進(jìn)行視頻捕捉之前必需要先創(chuàng)建一個捕捉窗口,并應(yīng)以此為基礎(chǔ)進(jìn)行所有的捕捉及設(shè)置操作。捕捉窗口可用AVICap窗口類的CapCreateCaptureWindow函數(shù)來創(chuàng)建,其窗口風(fēng)格可設(shè)置為WSCHILD和WS_VISIBLE參數(shù)。有了捕捉窗口,我們就可以將視頻流和音頻流捕捉到一個AVI文件中;動態(tài)地同視頻和音頻輸入器件連接或斷開;用Overlay或Preview模式對輸入的視頻流進(jìn)行實(shí)時顯示,設(shè)置捕捉速率,顯示控制視頻源、視頻格式及視頻壓縮的對話框,創(chuàng)建、保存或載入調(diào)色板,將圖像和相關(guān)的調(diào)色板拷貝到剪貼板,將捕捉的單幀圖像保存到BMP格式文件中。2.2 捕捉窗口和驅(qū)動程序的關(guān)聯(lián)僅僅一個捕捉窗口是不能工作起來的,它必須要與一個設(shè)備相關(guān)聯(lián)才能取得視頻信號。用函數(shù)CapDriverConnect可使捕捉窗與其設(shè)備驅(qū)動程序相關(guān)聯(lián)。2.3設(shè)置視頻設(shè)備的屬性通過設(shè)置TcaptureParms結(jié)構(gòu)變量的各個成員變量,可以控制設(shè)備的采樣頻率、中斷采樣按鍵、狀態(tài)行為。設(shè)置好TcaptureParms結(jié)構(gòu)變量后,可以用函CapCaptureSetSetup使設(shè)置生效。之后還可以用CapPreviewScale、CapPreviewRate設(shè)置預(yù)覽的比例與速度,也可以直接使用設(shè)備的默認(rèn)值。2.4打開預(yù)覽利用函數(shù)CapOverlay可選擇是否采用疊加模式預(yù)覽,以使系統(tǒng)資源占用小,視頻顯示速度加快。然后用CapPreview啟動預(yù)覽功能,這時就可以在屏幕上看到來自攝像頭的圖像了。2.5使用捕捉窗回調(diào)函數(shù)前的四個步驟就可以建立一個基本的視頻捕捉程序了,如果想自己處理從設(shè)備捕捉到的視頻數(shù)據(jù),則要使用捕捉窗回調(diào)函數(shù)來處理,比如一幀一幀地獲得視頻數(shù)據(jù),也可以以流的方式獲得視頻數(shù)據(jù)等等。2.6傳輸視頻流使用回調(diào)函數(shù)可以取得第一幀的數(shù)據(jù),我們使用網(wǎng)絡(luò)技術(shù)將數(shù)據(jù)發(fā)給其它機(jī)器,其它機(jī)品將接收的數(shù)據(jù)顯示出來。2.7接收視頻接收UDP數(shù)據(jù),同時將接收到的數(shù)據(jù)回顯出來,這樣就可以看到遠(yuǎn)處傳來的視頻了。三、用Delphi編寫程序代碼微軟的VFW SDK只有VC和VB版,并沒有Delphi版,不過在網(wǎng)上可以找到VFW.PAS文件,F(xiàn)W.PAS文件聲明了調(diào)用DLL中的各個函數(shù)和變量。(注:源代碼中提供了VFW.PAS文件)下面就以Delphi7開發(fā)一個網(wǎng)絡(luò)視頻聊天軟件,聊天軟件分兩個程序,一個是視頻采集程序并進(jìn)行UDP廣播的視頻聊天軟件服務(wù)器,另一個是接收UDP廣播程序顯示傳來的視頻數(shù)據(jù)的視頻聊天軟件客戶端。3.1建立視頻聊天軟件服務(wù)器3.1.1新建一個工程,命名為Project1.dpr,并把VFW.PAS加到USE中3.1.2在Form1上放置一個Tpanel控件,該控件用于顯示視頻。之后再放置兩個Tbutton控件,一個caption為開始,另一個Name為停止,放置一個UDP組件,這里用indy的IdUDPClient用來傳輸視頻,如圖示:3.1.3定義全局變量3.1.4編碼事件代碼 開始按鈕代碼:CapWnd := capCreateCaptureWindow(我的窗口, WS_VISIBLE or WS_CHILD,/窗口樣式 0, /X坐標(biāo) 0, /Y坐標(biāo) panel1.Width, /窗口寬 panel1.Height, /窗口高 panel1.handle, /窗口句柄 0); /通常為0 if CapWnd = 0 then exit; /定義幀捕捉回調(diào)函數(shù) CapSetCallbackOnFrame(CapWnd,FrameCallBack); CapParms.dwRequestMicroSecPerFrame:=1; CapParms.fLimitEnabled:=FALSE;CapParms.fCaptureAudio:=FALSE;CapParms.fMCIControl:=FALSE;CapParms.fYield:=TRUE;CapParms.vKeyAbort:=VK_ESCAPE;CapParms.fAbortLeftMouse:=False; CapParms.fAbortRightMouse:=FALSE; /讓設(shè)置生效CapCaptureSetSetup(capWnd,CapParms,sizeof(TCAPTUREPARMS);CapPreviewRate(capWnd,33); /設(shè)置預(yù)覽視頻的頻率CapCaptureSequenceNoFile(capWnd); /如果要捕捉視頻流,則要使用函數(shù)來指定不生成文件,不然會自動生成AVI文件 CapDriverConnect(CapWnd,0); /連接攝像頭設(shè)備,第二個參數(shù)是個序號,當(dāng)系統(tǒng)中裝有多個顯示驅(qū)動程序時,其值分別依次為0到總個數(shù)如果有多個攝像頭,那么就是0-1-2 capGetVideoFormat(capWnd, BMPINFO,sizeof(TBitmapInfo); /取得視頻圖像數(shù)據(jù)頭CapPreviewScale(capWnd,TRUE); /是否縮放CapOverlay(capWnd,true); /指定是否使用疊加模式,true為使用,否則為falseCapPreview(capWnd,true);回調(diào)函數(shù)代碼:var hd:Thandle; jpg:TJpegImage;memStream :TMemoryStream;Bitmap:TBitmap;begin /將數(shù)據(jù)顯在Image, Bitmap:=TBitmap.Create;Bitmap.Width :=BMPINFO.bmiHeader.biWidth;/ New size of Bitmap Bitmap.Height:=BMPINFO.bmiHeader.biHeight;hd:= DrawDibOpen; DrawDibDraw(hd,Bitmap.canvas.handle,0,0,_BMPINFO.BmiHeader.biwidth,BMPINFO.bmiheader.biheight,_BMPINFO.bmiHeader,lpVHdr.lpData,0,0,BMPINFO.bmiHeader.biWidth,_BMPINFO.bmiHeader.biheight,0);DrawDibClose(hd); /發(fā)送數(shù)據(jù)memStream := TMemoryStream.Create;jpg := TJpegImage.Create;jpg.Assign(Bitmap);jpg.CompressionQuality := 10; /jpg壓縮質(zhì)量jpg.JPEGNeeded; jpg.Compress; jpg.SaveToStream(memStream);jpg.Free; /因?yàn)閁DP數(shù)據(jù)包有大小限制,這里如果超出部分,就沒有傳輸,完全可以發(fā)幾次發(fā)出去Form1.IdUDPClient1.BroadcastEnabled:=true;/用廣播功能if memStream.SizeForm1.IdUDPClient1.BufferSize then /向192.168.0.X網(wǎng)段廣播,端口 9001Form1.IdUDPClient1.SendBuffer(55,9001,memStream.Memory,Form1.IdUDPClient1.BufferSize) else Form1.IdUDPClient1.SendBuffer(55,9001,memStream.Memory,memStream.Size);memStream.Free; Bitmap.Free;End;停止代碼:capCaptureAbort(CapWnd); /停止捕捉 capDriverDisconnect(CapWnd); /將捕捉窗同驅(qū)動器斷開完整的視頻聊天軟件服務(wù)器代碼:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,VFW, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,jpeg;type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton;Button2: TButton;IdUDPClient1: TIdUDPClient;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private Private declarations public Public declarations end;var Form1: TForm1;CapWnd:THandle; /定義捕捉窗句柄CapParms:TcaptureParms; /用于設(shè)置設(shè)備屬性的結(jié)構(gòu)變量BMPINFO:TBitmapInfo; /BMP圖像信息implementation$R *.dfmfunction FrameCallBack(hWnd: HWND; lpVHdr: PVIDEOHDR): LongInt;stdcall;var hd:Thandle;jpg:TJpegImage;memStream :TMemoryStream;Bitmap:TBitmap;begin /將數(shù)據(jù)顯在Image, Bitmap:=TBitmap.Create;Bitmap.Width :=BMPINFO.bmiHeader.biWidth;/ New size of Bitmap Bitmap.Height:=BMPINFO.bmiHeader.biHeight; hd:= DrawDibOpen; DrawDibDraw(hd,Bitmap.canvas.handle,0,0,BMPINFO.BmiHeader.biwidth,BMPINFO._bmiheader.biheight,BMPINFO.bmiHeader,_lpVHdr.lpData,0,0,BMPINFO.bmiHeader.biWidth,BMPINFO.bmiHeader.biheight,0);DrawDibClose(hd);/發(fā)送數(shù)據(jù) memStream := TMemoryStream.Create;jpg := TJpegImage.Create; jpg.Assign(Bitmap);jpg.CompressionQuality := 10; /jpg壓縮質(zhì)量 jpg.JPEGNeeded; jpg.Compress;jpg.SaveToStream(memStream);jpg.Free;/因?yàn)閁DP數(shù)據(jù)包有大小限制,這里如果超出部分,就沒有傳輸,完全可以發(fā)幾次發(fā)出去Form1.IdUDPClient1.BroadcastEnabled:=true;/用廣播功能if memStream.SizeForm1.IdUDPClient1.BufferSize then /向192.168.0.X網(wǎng)段廣播,端口 9001 Form1.IdUDPClient1.SendBuffer(55,9001,memStream.Memory,Form1.IdUDPClient1.BufferSize) elseForm1.IdUDPClient1.SendBuffer(55,9001,memStream.Memory,memStream.Size); memStream.Free;Bitmap.Free;end;procedure TForm1.Button1Click(Sender: TObject);beginCapWnd := capCreateCaptureWindow(我的窗口, WS_VISIBLE or WS_CHILD,/窗口樣式 0, /X坐標(biāo) 0, /Y坐標(biāo) panel1.Width, /窗口寬panel1.Height, /窗口高 panel1.handle, /窗口句柄 0); /通常為0 if CapWnd = 0 then exit; /定義幀捕捉回調(diào)函數(shù)CapSetCallbackOnFrame(CapWnd,FrameCallBack); CapParms.dwRequestMicroSecPerFrame:=1; CapParms.fLimitEnabled:=FALSE;CapParms.fCaptureAudio:=FALSE;CapParms.fMCIControl:=FALSE;CapParms.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工資水平調(diào)查報(bào)告表格
- 房地產(chǎn)領(lǐng)域從業(yè)經(jīng)歷及業(yè)績證明(8篇)
- 投融資體系中的信用評估體系建設(shè)問題
- 外語課程思政創(chuàng)新的理論基礎(chǔ)與發(fā)展趨勢
- 數(shù)學(xué)建?;A(chǔ)概念與解題方法講解
- DB14-T 3391-2025 大豆玉米帶狀復(fù)合種植田雜草綜合防控技術(shù)規(guī)程
- 未來的智能生活想象畫:想象作文6篇
- 印刷業(yè)數(shù)字化轉(zhuǎn)型現(xiàn)狀與挑戰(zhàn)分析
- 分子生物學(xué)基因表達(dá)調(diào)控知識卷
- 音樂理論演奏技能測試卷
- 一站式退休理財(cái)與養(yǎng)老規(guī)劃
- 倉庫打包發(fā)貨管理制度
- 微電子科學(xué)與工程專業(yè)職業(yè)生涯規(guī)劃書
- 《天工開物》課件
- 2022-2023學(xué)年遼寧省沈陽市高一下學(xué)期期末數(shù)學(xué)試題【含答案】
- 沉井施工技術(shù)交底
- 壓力鋼管制作施工方案
- 整本書閱讀三國演義閱讀推進(jìn)課課件公開課一等獎?wù)n件省課獲獎?wù)n件
- 砼攪拌車駕駛員安全生產(chǎn)責(zé)任制
- 部編版三年級道德與法治下冊《大家的“朋友”》教案及教學(xué)反思
- 改革開放與新時代智慧樹知到答案章節(jié)測試2023年同濟(jì)大學(xué)
評論
0/150
提交評論