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