Is it possible to record sound played on the sound card?

后端 未结 3 2021
挽巷
挽巷 2020-12-03 20:17

Is it even remotely possible to record sound that is being played on the sound card? Supposedly, I am playing an audio file, what I need is to redirect the output to the dis

相关标签:
3条回答
  • 2020-12-03 20:37

    You need to enable audio loopback device, and you will be able to record from in a stadnard way with all the well-known APIs (including DirectShow).

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

    Once enabled, you will see the device on DirectShow apps:

    enter image description here

    0 讨论(0)
  • 2020-12-03 20:51

    Check out NAudio and this thread for a WasapiLoopbackCapture class that takes the output from your soundcard and turns it into a wavein device you can record or whatever...

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

    0 讨论(0)
  • 2020-12-03 21:01

    My Solution C# NAUDIO Library 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
    

    Events

    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 -> Optional

    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();
                    }
                }
    
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题