You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏语音聊天开发:麦克风音频播放出现短暂中断,求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);
                    }
                }
            }
        }
    }
}

关键调整说明

  1. 调整事件订阅顺序,确保录制启动后所有数据都能被捕获并加入缓冲;
  2. 设置合理缓冲长度,开启溢出丢弃机制,平衡延迟与播放稳定性;
  3. 开启麦克风时填充短时长静音,避免缓冲空导致的即时断音;
  4. 改用48000Hz通用采样率,降低设备初始化适配延迟。

内容的提问来源于stack exchange,提问作者Finn Lukas B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:31:02