Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert WasapiLoopbackCapture wav audio stream to MP3 file

Tags:

c#

audio

naudio

I am able to capture system audio which is generated by speaker with the help of WasapiLoopbackCapture (naudio). but the problem is it capture wav file and size of wav file very large (almost 10 to 15 MB/Min). I have to capture 2-3 hour audio and this will be too high. I m looking for a solution that will convert wav stream which is capture by WasapiLoopbackCapture convert to MP3 and then save this to disk. I try a loat with LAME.exe or other solution but not get success. Any working code.

Here is My Code:

private void button1_Click(object sender, EventArgs e){
    LoopbackRecorder obj = new LoopbackRecorder();
    string a = textBox1.Text;
    obj.StartRecording(@"e:\aman.mp3");

}

public class LoopbackRecorder
{
    private IWaveIn _waveIn;
    private Mp3WaveFormat _mp3format;
    private WaveFormat _wavFormat;


    private WaveFileWriter _writer;
    private bool _isRecording = false;


    /// <summary>
    /// Constructor
    /// </summary>
    public LoopbackRecorder()
    {

    }

    /// <summary>
    /// Starts the recording.
    /// </summary>
    /// <param name="fileName"></param>
    public void StartRecording(string fileName)
    {
        // If we are currently record then go ahead and exit out.
        if (_isRecording == true)
        {
            return;
        }

        _fileName = fileName;
        _waveIn = new WasapiLoopbackCapture();
       // _waveIn.WaveFormat = new WaveFormat(16000, 16 , 2);
        _writer = new WaveFileWriter(fileName, _waveIn.WaveFormat);

        _waveIn.DataAvailable += OnDataAvailable;
      //  _waveIn.RecordingStopped += OnRecordingStopped;
        _waveIn.StartRecording();
        _isRecording = true;
    }




    private void OnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
    {
        if (_writer == null)
        {
            _writer = new WaveFileWriter(@"e:\aman.mp3", _waveIn.WaveFormat);
        }

        _writer.Write(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);

      byte[] by=  Float32toInt16(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);

    }

    private string _fileName = "";
    /// <summary>
    /// The name of the file that was set when StartRecording was called.  E.g. the current file being written to.
    /// </summary>
    public string FileName
    {
        get
        {
            return _fileName;
        }
    }
}
like image 595
Aman Sharma Avatar asked Nov 01 '13 06:11

Aman Sharma


1 Answers

Here's an example of using NAudio.Lame (in a console application) to capture data from sound card loopback and write direct to an MP3 file:

using System;
using NAudio.Lame;
using NAudio.Wave;

namespace MP3Rec
{
    class Program
    {
        static LameMP3FileWriter wri;
        static bool stopped = false;

        static void Main(string[] args)
        {
            // Start recording from loopback
            IWaveIn waveIn = new WasapiLoopbackCapture();
            waveIn.DataAvailable += waveIn_DataAvailable;
            waveIn.RecordingStopped += waveIn_RecordingStopped;
            // Setup MP3 writer to output at 32kbit/sec (~2 minutes per MB)
            wri = new LameMP3FileWriter( @"C:\temp\test_output.mp3", waveIn.WaveFormat, 32 );
            waveIn.StartRecording();

            stopped = false;

            // Keep recording until Escape key pressed
            while (!stopped)
            {
                if (Console.KeyAvailable)
                {
                    var key = Console.ReadKey(true);
                    if (key != null && key.Key == ConsoleKey.Escape)
                        waveIn.StopRecording();
                }
                else
                    System.Threading.Thread.Sleep(50);
            }

            // flush output to finish MP3 file correctly
            wri.Flush();
            // Dispose of objects
            waveIn.Dispose();
            wri.Dispose();
        }

        static void waveIn_RecordingStopped(object sender, StoppedEventArgs e)
        {
            // signal that recording has finished
            stopped = true;
        }

        static void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            // write recorded data to MP3 writer
            if (wri != null)
                wri.Write(e.Buffer, 0, e.BytesRecorded);
        }
    }
}

At the moment the NAudio.Lame package on NuGet is compiled for x86 only, so make sure your application is set to target that platform.

like image 151
Corey Avatar answered Sep 30 '22 10:09

Corey