是否可以录制声卡上播放的声音?

Posted

技术标签:

【中文标题】是否可以录制声卡上播放的声音?【英文标题】:Is it possible to record sound played on the sound card? 【发布时间】:2011-11-23 11:24:55 【问题描述】:

甚至可以远程录制声卡上正在播放的声音吗? 假设我正在播放一个音频文件,我需要将输出重定向到磁盘。 DirectShow 还是可行的。

非常感谢任何帮助,谢谢。

【问题讨论】:

您可能需要更加具体,以便有人帮助您,或者甚至确定这是否适合 *** 而不是其他网站之一。例如“我正在播放一个音频文件”可能意味着从“我点击一个 MP3 文件”到“我正在使用 ASIO 播放录制到文件中的样本”。 “DirectShow 或可能是可行的”这句话看起来你可能想说更多,因为写出来的内容是胡言乱语。 【参考方案1】:

您需要启用音频环回设备,并且您将能够使用所有知名 API(包括 DirectShow)以标准方式录制。

Loopback Recording Enabling "Stereo Mix" in Vista Capturing Window's audio in C#

启用后,您将在 DirectShow 应用上看到该设备:

【讨论】:

嗨,可以手动将音频输入我的麦克风吗? @BAKEZQ:不直接。您可以使用一些虚拟音频驱动软件来实现这一点。 是否可以编写我自己的虚拟 MIC 驱动程序并暴露一个套接字端点或其他通信端点?因此所有程序都可以控制我的 MIC 的输入。我找到了一个名为 WO MIC 的软件,它包含一个驱动程序和一个客户端,并且客户端可以与这个 VMIC 通信(发送音频作为输入),但我不知道它是如何工作的。 @BAKEZQ 编写驱动程序是一项具有挑战性的任务,您很可能根本不想这样做,因为它的复杂性被低估了。您可能应该查看已经实现必要驱动程序的虚拟音频电缆之类的软件。您应该能够创建一对设备:向其中一个(虚拟扬声器)播放音频,软件将信号循环回另一个虚拟麦克风,应用程序将其识别为真正的麦克风设备。 谢谢,我说的能实现吗?【参考方案2】:

查看 NAudio 和此线程以获取 WasapiLoopbackCapture 类,该类从声卡获取输出并将其转换为您可以录制的波形设备或其他任何东西...

https://naudio.codeplex.com/discussions/203605/

【讨论】:

【参考方案3】:

我的解决方案 C# NAUDIO 库 v1.9.0

waveInStream = new WasapiLoopbackCapture(); //record sound card.
waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(this.OnDataAvailable); // sound data event
waveInStream.RecordingStopped += new EventHandler<StoppedEventArgs>(this.OnDataStopped); // record stopped event
MessageBox.Show(waveInStream.WaveFormat.Encoding + " - " + waveInStream.WaveFormat.SampleRate +" - " + waveInStream.WaveFormat.BitsPerSample + " - " + waveInStream.WaveFormat.Channels);
//IEEEFLOAT - 48000 - 32 - 2
//Explanation: IEEEFLOAT = Encoding | 48000 Hz | 32 bit | 2 = STEREO and 1 = mono
writer = new WaveFileWriter("out.wav", new WaveFormat(48000, 24, 2));
waveInStream.StartRecording(); // record start

活动

WaveFormat myOutFormat = new WaveFormat(48000, 24, 2); // --> Encoding PCM standard.
private void OnDataAvailable(object sender, WaveInEventArgs e)

    //standard e.Buffer encoding = IEEEFLOAT
    //MessageBox.Show(e.Buffer + " - " + e.BytesRecorded);
    //if you needed change for encoding. FOLLOW WaveFormatConvert ->
    byte[] output = WaveFormatConvert(e.Buffer, e.BytesRecorded, waveInStream.WaveFormat, myOutFormat);            

    writer.Write(output, 0, output.Length);



private void OnDataStopped(object sender, StoppedEventArgs e)

    if (writer != null)
    
        writer.Close();
    

    if (waveInStream != null)
    
        waveInStream.Dispose();                
                


WaveFormatConvert -> 可选

public byte[] WaveFormatConvert(byte[] input, int length, WaveFormat inFormat, WaveFormat outFormat)

    if (length == 0)
        return new byte[0];
    using (var memStream = new MemoryStream(input, 0, length))
    
        using (var inputStream = new RawSourceWaveStream(memStream, inFormat))
                            
            using (var resampler = new MediaFoundationResampler(inputStream, outFormat)) 
                resampler.ResamplerQuality = 60; // 1 low - 60 max high                        
                //CONVERTED READ STREAM
                byte[] buffer = new byte[length];
                using (var stream = new MemoryStream())
                
                    int read;
                    while ((read = resampler.Read(buffer, 0, length)) > 0)
                    
                        stream.Write(buffer, 0, read);
                    
                    return stream.ToArray();
                
            

        
    

【讨论】:

以上是关于是否可以录制声卡上播放的声音?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Audacity 录制声卡声音

如何使用 WaveOut\waveIn Api 录制和播放声音 [关闭]

iOS - 在录制视频时播放音频/声音

Nadio - 多声音设备播放和录音问题

linux声卡同时播放多种声音

windows声音设置,一个音源,多个设备