2013-11-01 5 views
1

Я могу захватить системный звук, который генерируется динамиком с помощью WasapiLoopbackCapture (naudio). но проблема заключается в том, что wav-файл и размер wav-файла очень большие (почти 10-15 МБ/мин). Я должен захватить 2-3-часовой звук, и это будет слишком высоким. Я ищу решение, которое преобразует поток wav, который захватывает WasapiLoopbackCapture, конвертирует в MP3, а затем сохраняет это на диске. Я стараюсь Late.exe или другого решения, но не добиваться успеха. Любой рабочий код.Преобразование WasapiLoopbackCapture wav аудиопоток в файл MP3

Вот мой код:

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

Вот пример использования 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); 
     } 
    } 
} 

На данный момент NAudio.Lame пакета на NuGet скомпилирован для x86 только, поэтому убедитесь, что ваше приложение настроено на таргетинг на эту платформу.

+0

Привет Я не могу добавить с помощью NAudio.Lame; в моем проекте Я пытаюсь добавить lame_enc.dll, также не добавляя в мой проект, могли бы вы рассказать мне, как добавить это пространство имен в мой проект. –

+0

Привет, нет. Я могу добавить ref naudio.lame в мой проект, пока не отображается ошибка «Невозможно использовать локальную переменную waveIn» перед ее объявлением ». Я пробую это так: // Начните запись с петли IWaveIn waveIn = новый WasapiLoopbackCapture(); wri = new LameMP3FileWriter (@ "C: \ temp \ test_output.mp3", waveIn.WaveFormat, 128); waveIn.DataAvailable + = waveIn_DataAvailable; waveIn.RecordingStopped + = waveIn_RecordingStopped; waveIn.StartRecording(); stopped = false; , но он все еще показывает ошибку: -Поддерживаемый формат кодирования Расширяемый –

+0

Привет, Кори, благодаря его работе для меня сейчас. да, его ошибка на 64-битных машинах. Любое обходное решение для решения этой проблемы. –

1

Чтобы конвертировать аудио в MP3 на лету, один из самых простых способов является использование параметров командной строки, которые позволяют передавать звук в lame.exe через стандартный ввод. Я описываю, как это сделать в this article.

Вас, возможно, заинтересует, что Corey Murtagh создал a LAME package for NAudio. Я сам не пробовал, но похоже, что он тоже должен выполнять эту работу. Документация: here.

+1

Привет, мой первый штекер: P – Corey

+0

HI Я пытаюсь использовать этот код, но не получаю успех (копия из предоставленной вами статьи) строка outputFileName = @ "c: \ users \ mark \ documents \ test.mp3 «; Процесс p = новый процесс(); p.StartInfo.FileName = @ "lame.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.Arguments = "-r -s 16 -m m - \" "+ outputFileName +" \ ""; p.StartInfo.CreateNoWindow = true; p.Start(); // теперь напишите свой необработанный звук PCM в стандартный поток ввода и закройте его, когда закончите. p.StandardInput.BaseStream; –

Смежные вопросы