#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 [] . Пожалуйста, посмотрите мой отредактированный вопрос с дополнительными фрагментами кода.