首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 打造網路電話:DirectSound 錄播、編解碼、RTP 傳輸全流程實作

     編輯:關於C#

整體架構五步走

  1. 錄音:DirectSound Capture → 環形緩衝區 → 定期讀取 PCM 資料。
  2. 壓縮:PCM → G.711 (64 kbps) / GSM / Speex 等,再選擇性 GZip/7z 二次壓縮。
  3. 傳輸:UDP + RTP 封包(序號、時間戳) → RTCP 頻寬監控 → 動態切換編碼碼率。
  4. 解碼:對應解壓縮還原 PCM。
  5. 播放:SecondaryBuffer + 通知位置 → 循環填充播放。

核心程式碼片段

1. 錄音:CaptureSound 類別

  • CaptureDevicesCollection 列舉裝置 → CaptureBuffer 環形緩衝區。
  • Notify 設定 4 個位置通知,執行緒 WaitThread 等待事件 → RecordCapturedData 讀取資料 → 觸發 BufferData 事件交給上層編碼/傳輸。
  • 同步寫入 WAV 檔(RIFF 標頭)供除錯。

2. 播放:SoundPlayer 類別

  • SecondaryBuffer 設定 ControlPositionNotify、BufferPlayFlags.Looping。
  • 通知執行緒 NotifyThreadHandler 收到事件 → Play() 計算可寫區塊 → 從 CircularBuffer 讀資料 → Write 進 DirectSound 緩衝區。
  • 環形緩衝區 CircularBuffer 解耦網路抖動與播放時鐘。

3. 波形格式工廠


public static WaveFormat CreateWaveFormat(int hz, short bits, short ch)
{
    var f = new WaveFormat { FormatTag = WaveFormatTag.Pcm, SamplesPerSecond = hz, BitsPerSample = bits, Channels = ch };
    f.BlockAlign = (short)(f.Channels * (f.BitsPerSample / 8));
    f.AverageBytesPerSecond = f.BlockAlign * f.SamplesPerSecond;
    return f;
}
// 預設 8kHz/8bit/單聲道,適合語音頻寬
public static WaveFormat DefaultFormat => CreateWaveFormat(8000, 8, 1);

關鍵技術選型建議

環節推薦方案備註
編碼G.711 (μ-law/A-law)簡單、免授權、CPU 開銷極低、64kbps 寬頻足夠
二次壓縮SharpZipLib (GZip) / 7z LZMA視 CPU/頻寬權衡,語音幀小 GZip 通常足夠
傳輸協定UDP + RTP/RTCP參考 RFC 3550,自行實作序號、時間戳、SR/RR 回報
NAT 穿透STUN / TURN / ICE可整合既有庫 (如 SIPSorcery) 避免重造輪子

版權與參考資料聲明

文中 CaptureSound、SoundPlayer、CircularBuffer 反編譯自「隨意桌面」專案,版權歸原作者。PPT 圖片來源已不可考,僅供學習參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved