WASAPI loopback音频导入Unity2020生成AudioSource或对接WebRTC求助
核心问题定位
你当前的错误根源是WavUtility.ToAudioClip接口要求输入带完整WAV头的音频字节流,而你传入的是WASAPI采集输出的裸PCM数据流,没有文件头标识采样率、通道数、位深度等元信息,自然无法被识别为合法的音频资源。
除此之外你的实现逻辑还有两个影响功能的错误:
- 每次读取到分片的音频缓冲区就直接生成新AudioClip并播放,不仅会产生大量资源泄漏,也会导致播放的音频是碎片化的,完全无法形成连续的声音
DataAvailable是NAudio工作线程触发的回调,直接在回调内调用print、Playclip2这类Unity主线程独占API,会触发线程安全异常,大概率会直接崩溃
解决方案
1. Unity本地实时播放实现
不需要依赖WavUtility做转换,直接按Unity音频流的规范处理即可:
- 提前从
_realtimeSource.WaveFormat中获取采集音频的采样率、通道数、位深度三个核心参数,确认PCM的存储格式(WASAPI回采默认是32位浮点PCM) - 预先创建支持流模式的环形AudioClip,示例代码:
// 按采集参数创建长度为1秒的循环流AudioClip int sampleRate = _realtimeSource.WaveFormat.SampleRate; int channels = _realtimeSource.WaveFormat.Channels; _audioClip = AudioClip.Create("RealtimeAudio", sampleRate * channels, channels, sampleRate, true); // 挂到提前准备好的AudioSource上,开启循环播放 _audioSource.clip = _audioClip; _audioSource.loop = true; _audioSource.Play();
- 实现线程安全的PCM数据队列,在
DataAvailable回调里只做数据入队操作,在主线程Update中取队列数据,转成Unity要求的[-1f,1f]范围的浮点数组后,用AudioClip.SetData按偏移写入环形缓冲区即可
2. 直接送WebRTC实现
完全不需要中转AudioClip,减少性能损耗:
- 确认WebRTC音频轨道要求的采样率、通道数、位深度参数,将采集到的裸PCM数据做对应重采样、格式转换
- 直接将转换后的PCM数据送入WebRTC音频发送轨道的输入接口即可
额外注意事项
你当前的协程逻辑只等待一帧就结束了,需要额外维护WasapiLoopbackCapture、SoundInSource等对象的生命周期,在场景销毁或者停止采集时主动释放资源,避免内存泄漏和进程残留。
内容的提问来源于stack exchange,提问作者Nathanial Granzotto
相关产品推荐
相关产品推荐

