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)的主要内容,如果未能解决你的问题,请参考以下文章

NAudio 的问题

NAudio 演示不再工作

NAudio:正确使用 MixingSampleProvider 和 VolumeSampleProvider

NAudio 和 Midi 文件读取

来自流的NAudio?播放音频

NAudio,Windows服务,多线程