将WasapiLoopbackCapture wav音频流转换为MP3文件

时间:2013-11-01 06:43:18

标签: c# audio naudio

我能够在WasapiLoopbackCapture(naudio)的帮助下捕获扬声器生成的系统音频。但问题是它捕获wav文件和wav文件的大小非常大(几乎10到15 MB / Min)。我必须捕获2-3小时的音频,这将太高了。 我正在寻找一种解决方案,将wap流转换为WasapiLoopbackCapture转换为MP3,然后将其保存到磁盘。我尝试使用LAME.exe或其他解决方案,但没有成功。任何有效的代码。

这是我的代码:

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;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

以下是使用NAudio.Lame(在控制台应用程序中)从声卡环回中捕获数据并直接写入MP3文件的示例:

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);
        }
    }
}

目前,NuGet上的NAudio.Lame软件包仅针对x86进行编译,因此请确保将您的应用程序设置为针对该平台。

答案 1 :(得分:1)

要将音频动态转换为MP3,最简单的方法之一是使用命令行选项,让您通过stdin将音频传递到LAME.exe。我在this article中描述了如何做到这一点。

您可能也对Corey Murtagh创建的a LAME package for NAudio感兴趣。我自己没有尝试过,但它看起来应该也能完成这项工作。文档为here