Записать аудио в память, затем сохранить в файл - PullRequest
0 голосов
/ 21 мая 2018

Я использую NAudio для захвата 15 секунд аудио.Примерно так:

MemoryStream bufferedVoice = new MemoryStream();
voiceCapturer = new WasapiLoopbackCapture(OutputDevice);
voiceCapturer.DataAvailable += onVoiceOutputReceived;
voiceCapturer.StartRecording();

private void onVoiceOutputReceived(object sender, WaveInEventArgs e)
{
    bufferedVoice.Write(e.Buffer, 0, e.BytesRecorded);    
}

И через 15 секунд я хочу сохранить его в файл и выйти.Я попробовал это так, но это не сработало:

var ResourceWaveStream = new RawSourceWaveStream(bufferedVoice, voiceCapturer.WaveFormat);
var SampleProvider = new WaveToSampleProvider(ResourceWaveStream).ToWaveProvider16();
var fileWriter = new WaveFileWriter("output.mp3", SampleProvider.WaveFormat);

byte[] buf = new byte[8192];
while(SampleProvider.Read(buf, 0, buf.Length) > 0)
{
    fileWriter.Write(buf, 0, buf.Length);
}
fileWriter.Dispose();

Как сохранить поток памяти в файл?

Уточнение: я хочу сохранить в памяти только x секунд звука,Поэтому, когда максимальный размер достигнут, часть самой старой части удаляется.Затем, если я нажимаю кнопку, я хочу сохранить 15 секунд звука в файл.

Теперь мой вопрос: как мне сохранить звук в памяти, а затем записать его в файл?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Хорошо, у меня наконец есть решение.Сначала я копирую звуковые данные прямо в поток памяти.И затем, когда мне это нужно, я считываю весь поток памяти в RawSourceWaveStream, а затем передаю его в окончательный WaveFileWriter.Если кому-то интересно, как я это сделал, напишите мне.

Спасибо.

0 голосов
/ 22 мая 2018

Попробуйте это:

using(var fileWriter = new WaveFileWriter("yourOutputFile", SampleProvider.WaveFormat)
{
    ResourceWaveStream.CopyTo(fileWriter);
}

Кстати, здесь вам пригодится блок «using», поскольку он автоматически удалит средство записи, позволяя WaveFileWriter записывать заголовки в файл.

...