一
引言
我們知道視頻聊天軟件的關鍵技術在於采集視頻並實時傳輸給聊天軟件在線的人對於視頻的采集這裡采用微軟公司的關於數字視頻的一個軟件包VFW(Video for Windows)相信很多人對它都很熟習VFW能使應用程序通過數字化設備從傳統的模擬視頻源得到數字化的視頻剪輯VFW的一個關鍵思想是播放時不需要專用硬件為了解決數字視頻數據量大的問題需要對數據進行壓縮而VFW引進了AVI的文件標准該標准未規定如何對視頻進行捕捉壓縮及播放僅規定視頻和音頻該如何存儲在硬盤上及在AVI文件中交替存儲視頻幀和與之相匹配的音頻數據通過VFW開發人員通過發送消息或設置屬性來捕捉播放和編輯視頻剪輯當用戶在安裝VFW時安裝程序會自動地安裝配置視頻所需要的組件如設備驅動程序視頻壓縮程序等VFW主要由個模塊組成VFW功能模塊
AVICAPDLL 包含執行視頻捕捉的函數它給AVI文件的I/O處理和視頻音頻設備驅動程序提供一個高級接口
MSVIDEODLL 包含一套特殊的DrawDib函數用來處理屏幕上的視頻操作
MCIAVIDRV 包括對VFW的MCI命令解釋器的驅動程序
AVIFILEDLL 包含由標准多媒體I/O(mmio)函數提供的更高的命令用來訪問AVI文件
ICM 壓縮管理器用於管理的視頻壓縮/解壓縮的編譯碼器(Codec)
ACM 音頻壓縮管理器提供與ICM相似的服務適用於波形音頻
對於視頻的傳輸我們使用UDP來傳因為UDP傳輸速度快TCP是面向連接的建立連接時雙方需經過三次握手數據傳輸可靠FTPtelnet等就是基於TCP的UDP是面向非連接的發出信息不需對方確認但這樣速度比TCP快但有可能丟失數據象SMTPtftp等就是基於UDP的另外UDP還支持廣播UDP廣播兩種一種是directed broadcast比如你的網段是X你就往發就可以了另一種是limited broadcast廣播地址是
二視頻聊天軟件的開發步驟
創建捕捉窗口采集視頻
在進行視頻捕捉之前必需要先創建一個捕捉窗口並應以此為基礎進行所有的捕捉及設置操作捕捉窗口可用AVICap窗口類的CapCreateCaptureWindow函數來創建其窗口風格可設置為WSCHILD和WS_VISIBLE參數
有了捕捉窗口我們就可以將視頻流和音頻流捕捉到一個AVI文件中動態地同視頻和音頻輸入器件連接或斷開用Overlay或Preview模式對輸入的視頻流進行實時顯示設置捕捉速率顯示控制視頻源視頻格式及視頻壓縮的對話框創建保存或載入調色板將圖像和相關的調色板拷貝到剪貼板將捕捉的單幀圖像保存到BMP格式文件中
捕捉窗口和驅動程序的關聯
僅僅一個捕捉窗口是不能工作起來的它必須要與一個設備相關聯才能取得視頻信號用函數CapDriverConnect可使捕捉窗與其設備驅動程序相關聯
設置視頻設備的屬性
通過設置TcaptureParms結構變量的各個成員變量可以控制設備的采樣頻率中斷采樣按鍵狀態行為設置好TcaptureParms結構變量後可以用函CapCaptureSetSetup使設置生效之後還可以用CapPreviewScaleCapPreviewRate設置預覽的比例與速度也可以直接使用設備的默認值
打開預覽
利用函數CapOverlay可選擇是否采用疊加模式預覽以使系統資源占用小視頻顯示速度加快然後用CapPreview啟動預覽功能這時就可以在屏幕上看到來自攝像頭的圖像了
使用捕捉窗回調函數
前的四個步驟就可以建立一個基本的視頻捕捉程序了如果想自己處理從設備捕捉到的視頻數據則要使用捕捉窗回調函數來處理比如一幀一幀地獲得視頻數據也可以以流的方式獲得視頻數據等等
傳輸視頻流
使用回調函數可以取得第一幀的數據我們使用網絡技術將數據發給其它機器其它機品將接收的數據顯示出來
接收視頻
接收UDP數據同時將接收到的數據回顯出來這樣就可以看到遠處傳來的視頻了
三用Delphi編寫程序代碼
微軟的VFW SDK只有VC和VB版並沒有Delphi版不過在網上可以找到VFWPAS文件FWPAS文件聲明了調用DLL中的各個函數和變量(注源代碼中提供了VFWPAS文件)
下面就以Delphi開發一個網絡視頻聊天軟件聊天軟件分兩個程序一個是視頻采集程序並進行UDP廣播的視頻聊天軟件服務器另一個是接收UDP廣播程序顯示傳來的視頻數據的視頻聊天軟件客戶端
建立視頻聊天軟件服務器
)新建一個工程命名為Projectdpr並把VFWPAS加到USE中
)在Form上放置一個Tpanel控件該控件用於顯示視頻之後再放置兩個Tbutton控件一個caption為開始另一個Name為停止放置一個UDP組件這裡用indy的IdUDPClient用來傳輸視頻如圖示
用Delphi開發視頻聊天軟件(二)
用Delphi開發視頻聊天軟件(三)
From:http://tw.wingwit.com/Article/program/Delphi/201311/24745.html