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

我能够在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; ///  /// Constructor ///  public LoopbackRecorder() { } ///  /// Starts the recording. ///  ///  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 = ""; ///  /// The name of the file that was set when StartRecording was called. Eg the current file being written to. ///  public string FileName { get { return _fileName; } } } 

以下是使用NAudio.Lame (在控制台应用程序中)从声卡环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进行编译,因此请确保将应用程序设置为以该平台为目标。

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

您可能也有兴趣Corey Murtagh 为NAudio创建了一个LAME包 。 我自己没有尝试过,但看起来它应该也能完成这项工作。 文档在这里 。