區域網路即時視訊傳輸廣泛應用於監控、會議、遠端教學等領域。有線網路雖穩定但佈線受限;無線網路雖靈活卻易受干擾導致畫面重影、抖動、花屏。本文提出一套通用解決方案:基於 VC++ 封裝 Windows VFW SDK、採用 DivX (MPEG-4 + MP3) 編解碼、結合自訂「停等」流控策略,有效解決網路抖動造成的畫質劣化問題。
網路頻寬有限,必須壓縮視訊。MPEG-4 具高壓縮比、靈活編解碼複雜度、物件導向編碼、強容錯等優點。本系統採用 DivX 編解碼器(實質為 MPEG-4 視訊 + MP3 音訊)。
UDP 適合即時串流但無錯誤修正;DivX 以幀為單位編碼(I-frame/P-frame),單比特錯誤即影響數百位元,導致花屏,需等待下一 I-frame 恢復。RTP/RTCP 雖提供流控,但動態調整編碼參數需重啟編解碼器,延遲過大不符即時需求。綜合考量,本系統選擇 TCP 保證可靠傳輸,應用層自訂幀封裝與流控策略。
核心思想:最少發送冗餘資訊,最大程度發送最新畫面。發送執行緒發送完一幀後掛起,等待回調函數喚醒。回調函數檢查發送緩衝區狀態:若前一幀已發送完畢(isOK == true),則採集新幀、壓縮、喚醒發送執行緒;否則直接丟棄當前採集幀,等待下一次回調。此策略犧牲幀率(劇烈運動時出現「瞬間移動」),換取畫面清晰無重影、無花屏。
採用 Server/Client 模式,工作流程:
SetDIBitsToDevice() 繪製
[幀起始標誌: 0xFFFFFFFF] [幀總大小] [幀序號] [幀類型: I/P] [幀資料]
while(1) {
isOK = true; // 準備就緒
SuspendThread(sendThread); // 掛起等待喚醒
isOK = false; // 正在發送
int length = frameLength;
if (length < 50000) { // 資料合理性檢查
while (length > 0) {
n = send(sock, (char*)imageBuf + sendCount, length, 0);
if (n == SOCKET_ERROR) break;
length -= n; sendCount += n;
}
}
}
核心演算法:尋找起始標誌 → 讀取幀大小 → 循環讀取剩餘資料 → 完整則解碼顯示。使用雙緩衝區(recBuf 暫存、imageBuf 組裝)處理 TCP 訊息邊界不固定問題。
| 網路環境 | 劇烈運動 | 正常運動 | 緩慢運動 |
|---|---|---|---|
| 100M 有線 | 清晰流暢 | 清晰流暢 | 清晰流暢 |
| 10M 有線 | 偶爾停頓,丟幀 ~1% | 清晰,肉眼流暢 | 清晰流暢 |
| 11M 無線 (USB 1.0) | 頻繁停頓,丟幀 5-6% | 頻繁停頓,丟幀 2-3% | 偶爾停頓,丟幀 ~1% |
註:USB 2.0 介面無線網卡效果將顯著改善。
本方案結合 VFW 擷取、DivX 高效編碼、TCP 可靠傳輸與「停等」應用層流控,在 100M/10M 有線與 11M 無線網路均達到實用級即時視訊品質。雖犧牲極端情況下的幀率,但徹底消除重影、花屏、抖動等嚴重畫質缺陷,適合工業監控、遠端會議等對畫面清晰度要求較高的應用場景。