CaptureDevicesCollection 列舉裝置 → CaptureBuffer 環形緩衝區。Notify 設定 4 個位置通知,執行緒 WaitThread 等待事件 → RecordCapturedData 讀取資料 → 觸發 BufferData 事件交給上層編碼/傳輸。SecondaryBuffer 設定 ControlPositionNotify、BufferPlayFlags.Looping。NotifyThreadHandler 收到事件 → Play() 計算可寫區塊 → 從 CircularBuffer 讀資料 → Write 進 DirectSound 緩衝區。CircularBuffer 解耦網路抖動與播放時鐘。
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 圖片來源已不可考,僅供學習參考。