NAudio WasapiLoopbackCapture ComException (0x88890003)
Posted
技术标签:
【中文标题】NAudio WasapiLoopbackCapture ComException (0x88890003)【英文标题】: 【发布时间】:2014-07-04 03:09:18 【问题描述】:我正在尝试使用 WasapiLoopbackCapture 类 (NAudio 1.7.1.17) 并以 COMException (0x88890003) 结束。录音格式为WaveFormat(44100, 16, 2)
。我的系统上有多个播放设备,并尝试将每个设备都设置为默认设备,结果相同。我还验证了这些设备中的每一个都将(44100, 16, 2)
列为受支持的格式。
控制台输出:
WasapiCapture_RecordingStopped.
Exception: System.Runtime.InteropServices.COMException (0x88890003): Exception from HRESULT: 0x88890003
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at NAudio.CoreAudioApi.AudioClient.get_AudioCaptureClient()
at NAudio.CoreAudioApi.WasapiCapture.DoRecording(AudioClient client)
at NAudio.CoreAudioApi.WasapiCapture.CaptureThread(AudioClient client)
代码:
public static class Program
private static int Index = 0;
private static int TotalBytesRecorded = 0;
private static bool RecordingStopped = false;
private static void Main (string [] args)
var device = NAudio.Wave.WasapiLoopbackCapture.GetDefaultLoopbackCaptureDevice();
using (var capture = new NAudio.CoreAudioApi.WasapiCapture(device))
capture.WaveFormat = new NAudio.Wave.WaveFormat(44100, 16, 2);
capture.ShareMode = NAudio.CoreAudioApi.AudioClientShareMode.Shared;
capture.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(Program.WasapiCapture_DataAvailable);
capture.RecordingStopped += new EventHandler<NAudio.Wave.StoppedEventArgs>(Program.WasapiCapture_RecordingStopped);
Program.Index = 0;
Program.TotalBytesRecorded = 0;
Program.RecordingStopped = false;
capture.StartRecording();
Thread.Sleep(TimeSpan.FromSeconds(10));
capture.StopRecording();
while (!Program.RecordingStopped)
Thread.Sleep(TimeSpan.FromMilliseconds(10));
Console.WriteLine();
Console.WriteLine();
Console.Write("TotalBytesRecorded: 0.", Program.TotalBytesRecorded.ToString("N0"));
private static void WasapiCapture_DataAvailable (object sender, NAudio.Wave.WaveInEventArgs e)
Program.Index++;
Program.TotalBytesRecorded += e.BytesRecorded;
Console.WriteLine();
Console.Write
(
"Index: 0, BytesRecorded: 1, Buffer Length: 2, TotalBytesRecorded: 3.",
Program.Index.ToString("N0").PadLeft(10, ' '),
e.BytesRecorded.ToString("N0").PadLeft(10, ' '),
e.Buffer.Length.ToString("N0").PadLeft(10, ' '),
Program.TotalBytesRecorded.ToString("N0").PadLeft(10, ' ')
);
private static void WasapiCapture_RecordingStopped (object sender, NAudio.Wave.StoppedEventArgs e)
Program.RecordingStopped = true;
Console.WriteLine();
Console.WriteLine();
Console.Write("WasapiCapture_RecordingStopped.");
if (e.Exception != null)
Console.WriteLine();
Console.WriteLine();
Console.Write("Exception: 0", e.Exception);
任何提示将不胜感激。
【问题讨论】:
只用谷歌搜索错误代码。成功的is here。 @HansPassant:谢谢。我已经搜索并找到了三个讨论,包括你链接到的那个。不幸的是,除了 Mark 在 WASAPI 论坛上提出的建议之外,所有内容都已检查。由于我需要一个项目的一些简单的捕获/流式传输功能,所以现在已经转移到 Bass.NET(仍在使用 WASAPI)。 @RaheelKhan 我正在使用您的部分代码,但是当我从默认设备播放音频时,我的DataAvailable
事件没有被引发。任何想法为什么?
@Ibrahim:没有看到实际代码就无法判断。您可以创建一个最小版本并将其发布到 SO。
【参考方案1】:
您无法为 WASAPI 环回捕获设置捕获 - 您必须使用系统混合格式,该格式将使用 32 位浮点样本。直接使用WasapiLoopbackCapture
类就可以了。
【讨论】:
谢谢你,马克!我将using
语句更改为using (var capture = new NAudio.Wave.WasapiLoopbackCapture(device))
,它给了我更明智的例外WaveFormat cannot be set for WASAPI Loopback Capture
。评论这条线是有效的。以上是关于NAudio WasapiLoopbackCapture ComException (0x88890003)的主要内容,如果未能解决你的问题,请参考以下文章