游戏语音聊天开发:麦克风音频播放出现短暂中断,求C#代码排查
游戏语音聊天音频中断问题排查与修复
问题描述
我正在开发一款游戏语音聊天功能,先尝试将麦克风采集的音频直接播放到扬声器。在Java和C#中均遇到相同问题:启动录制后约0.5秒会出现一次时长约0.25秒的音频中断,之后恢复正常。添加了A键开关麦克风,每次开启音频时都会出现上述中断。以下是我使用的C#代码:
using System; using NAudio.Wave; namespace VoiceChat { internal class Program { public static void Main(string[] args) { var mic = false; var recorder = new WaveInEvent { WaveFormat = new WaveFormat(96000, 2), BufferMilliseconds = 10, NumberOfBuffers = 10 }; var sound = new BufferedWaveProvider(recorder.WaveFormat); var playback = new WaveOutEvent(); recorder.StartRecording(); playback.Init(sound); playback.Play(); recorder.DataAvailable += (sender, eventArgs) => { if (mic) { sound.AddSamples(eventArgs.Buffer, 0, eventArgs.BytesRecorded); } }; while (true) { var key = Console.ReadKey(); if (key.Key.Equals(ConsoleKey.A)) { mic = !mic; } } } } }
核心问题与修复方案
问题点分析
- 事件订阅时机错误:启动录制后才订阅
DataAvailable事件,导致前几帧音频数据直接丢失,缓冲无数据可播放,引发短暂中断。 - 麦克风开启时缓冲为空:第一次开启
mic时,缓冲没有预填充数据,需要等待采集数据填充后才能播放,造成断音。 - 高采样率兼容性问题:96000Hz采样率虽质量高,但部分设备适配差,初始化阶段易产生延迟。
修改后的代码
using System; using NAudio.Wave; namespace VoiceChat { internal class Program { public static void Main(string[] args) { var mic = false; // 采用通用采样率,提升设备兼容性 var waveFormat = new WaveFormat(48000, 2); var recorder = new WaveInEvent { WaveFormat = waveFormat, BufferMilliseconds = 10, NumberOfBuffers = 10 }; var sound = new BufferedWaveProvider(waveFormat); // 设置足够缓冲长度,避免播放欠载 sound.BufferLength = waveFormat.AverageBytesPerSecond * 2; // 缓冲溢出时丢弃旧数据,避免延迟累积 sound.DiscardOnBufferOverflow = true; var playback = new WaveOutEvent(); // 先订阅数据事件,再启动录制,确保第一帧数据被捕获 recorder.DataAvailable += (sender, eventArgs) => { if (mic) { sound.AddSamples(eventArgs.Buffer, 0, eventArgs.BytesRecorded); } }; recorder.StartRecording(); playback.Init(sound); playback.Play(); while (true) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.A) { mic = !mic; if (mic) { // 开启麦克风时填充100ms静音,过渡缓冲空的阶段 var silence = new byte[waveFormat.AverageBytesPerSecond / 10]; sound.AddSamples(silence, 0, silence.Length); } } } } } }
关键调整说明
- 调整事件订阅顺序,确保录制启动后所有数据都能被捕获并加入缓冲;
- 设置合理缓冲长度,开启溢出丢弃机制,平衡延迟与播放稳定性;
- 开启麦克风时填充短时长静音,避免缓冲空导致的即时断音;
- 改用48000Hz通用采样率,降低设备初始化适配延迟。
内容的提问来源于stack exchange,提问作者Finn Lukas B.
相关产品推荐
相关产品推荐

