Как записать аудио с помощью naudio в байт [], а не в файл

#c# #naudio

#c# #naudio

Вопрос:

Я могу записывать аудио с помощью naudio в файл, теперь я хочу, чтобы оно было в байте [] или потоке на c #.

 this.writer = new WaveFileWriter(this.outputFilename, this.waveIn.WaveFormat);
  

То, что я пробовал до сих пор, — это вместо передачи выходного имени файла в конструкторе WaveFileWriter передать объект MemoryStream. Со ссылкой на объект stream я пытаюсь воспроизвести его с помощью Soundplayer после завершения записи.

 private IWaveIn waveIn;
private WaveFileWriter writer;
private string outputFilename;

private Stream memoryStream;

public void onRecord(object inputDevice, string fileName)
{
    if (this.waveIn == null)
    {
            this.outputFilename = fileName;
            this.waveIn = new WasapiLoopbackCapture((MMDevice)inputDevice);

            if(memoryStream == null)
                   memoryStream = new MemoryStream();

            this.writer = new WaveFileWriter(this.memoryStream,this.waveIn.WaveFormat);
            this.waveIn.DataAvailable  = new EventHandler<WaveInEventArgs>(this.OnDataAvailable);
            this.waveIn.RecordingStopped  = new EventHandler<StoppedEventArgs>(this.OnRecordingStopped);
            this.waveIn.StartRecording();
    }
}

private void OnDataAvailable(object sender, WaveInEventArgs e)
{
    this.writer.Write(e.Buffer, 0, e.BytesRecorded);
}

public void OnRecordingStopped(object sender, StoppedEventArgs e)
{
    if (this.waveIn != null)
    {
            this.waveIn.Dispose();
        this.waveIn = null;
    }

    if (this.writer != null)
    {
        this.writer.Close();
        this.writer = null;
    } 
}
  

В целях тестирования я создал приведенный ниже код, чтобы проверить, может ли он воспроизводить записанный звук.

 System.Media.SoundPlayer soundPlayer = new System.Media.SoundPlayer();

memoryStream.Position = 0; 
soundPlayer.Stream = null;
soundPlayer.Stream = memoryStream;
soundPlayer.Play();
  

Но когда я пытаюсь использовать вышеуказанный способ, я получаю систему.Исключение ObjectDisposedException: не удается получить доступ к закрытому потоку. В строке MemoryStream.Position = 0; .Я не удалял объект stream, не знаю, где именно он будет удален.

Комментарии:

1. Пожалуйста, покажите соответствующие части кода, который вы используете в данный момент.

2. он удаляется, когда вы удаляете запись. В этой ситуации я довольно часто создаю «IgnoreDisposeStream», чтобы обернуть поток памяти. Кроме того, почему вы используете NAudio только для записи, а не для воспроизведения?

3. @MarkHeath Спасибо за информацию. Фрагмент кода, который я использовал для воспроизведения, предназначен только для тестирования. Изначально я использовал naudio для воспроизведения в своем коде, просто попробовал с Soundplayer, который я раньше не использовал.

Ответ №1:

Как предлагает Марк, я обернул memoryStream с IgnoreDisposeStream помощью, и это работает.

 this.writer = new WaveFileWriter(new IgnoreDisposeStream(memoryStream),this.waveIn.WaveFormat);
  

Ответ №2:

Не создавайте поток памяти. Используйте свою систему.Медиафайлы.SoundPlayer как поток.

 byte[] buff = new byte[1024];   //or bigger...
System.Media.SoundPlayer soundPlayer = new System.Media.SoundPlayer();
soundPlayer.Stream.Read(buff, 0, (buff.Length - 1));
  

Комментарии:

1. Привет! прошу прощения за вводящий в заблуждение вопрос, моя основная цель — записать аудио в byte [] . Пожалуйста, посмотрите мой отредактированный вопрос с дополнительными фрагментами кода.

Ответ №3:

Класс SoundPlayer не подходит для этого, поскольку он считывает весь поток перед началом воспроизведения. Для этого также требуется, чтобы поток был в формате файла Wave, поэтому вам придется использовать WaveFileWriter для записи всех ваших аудиоданных, прежде чем вы сможете использовать поток с SoundPlayer.

Я бы рекомендовал вам использовать WaveOutEvent от NAudio (или аналогичный) для вывода звука. Это устраняет необходимость в потоке и позволяет воспроизводить записанный звук практически в режиме реального времени (у него будет задержка; насколько это зависит от вашего оборудования и от размера всех задействованных буферов).

Комментарии:

1. Привет! прошу прощения за вводящий в заблуждение вопрос, моя основная цель — записать аудио в byte [] . Пожалуйста, посмотрите мой отредактированный вопрос с дополнительными фрагментами кода.