我正试图捕捉通过电脑进行操作并在realTime中播放的所有声音(由于操作可能会有轻微的延迟,但不会太严重)。
我正在尝试使用Naudio wasapi。问题是:
当我以独占模式执行此操作时,此行:audioClient.Initialize(shareMode, AudioClientStreamFlags.EventCallback, latencyRefTimes, latencyRefTimes,outputFormat, Guid.Empty);
抛出此异常:
NAudio.dll中出现未处理的“System.Runtime.InteropServices.COMException”类型异常
其他信息:HRESULT:0x88890016
当我在共享模式下执行此操作时,我会收到很多噪音,我认为这是由声音反馈引起的(类似于同时录制和播放时会发生什么)
这是我的代码:
WasapiLoopbackCapture source = new WasapiLoopbackCapture();
source.DataAvailable += CaptureOnDataAvailable;
bufferedWaveProvider = new BufferedWaveProvider(source.WaveFormat);
volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());
WasapiOut soundOut = new WasapiOut(AudioClientShareMode.Shared, 0);
soundOut.Init(volumeProvider);
soundOut.Play();
source.StartRecording();
soundOut.Volume = 0.5f;
}
private void CaptureOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
{
int length = waveInEventArgs.Buffer.Length;
byte[] byteSamples = new Byte[length];
float[] buffer = waveInEventArgs.Buffer.toFloatArray(waveInEventArgs.BytesRecorded);//buffer to contains the samples about to be manipulated
fixer.fixSamples(length / 2, buffer, ref fixedSamples);
if (fixedSamples.Count > 0)
{
//convert the fixed samples back to bytes in order for them to be able to play out
byteSamples = fixedSamples.convertToByteArray(position);
bufferedWaveProvider.AddSamples(byteSamples, 0, byteSamples.Length);
volumeProvider.Volume = .5f;
}
position = fixedSamples.Count;
}
我该如何解决这些问题?
另外,我不知道这是否是我尝试做的最佳方法,所以如果有人更好地了解如何做到这一点,我会非常高兴听到。 (我想过使用asio,但决定不要因为有很多没有asio驱动程序的计算机)
答案 0 :(得分:0)
此错误为AUDCLNT_E_UNSUPPORTED_FORMAT
您只能使用WASAPI捕获某些格式的音频。通常必须是IEEE float,stereo,44.1kHz / 48kHz