2015-05-31 2 views
0

Я пытаюсь преобразовать аудиофайлы MP3 в WAV со стандартной скоростью (48 кГц, 16 бит, 2 канала), открыв с помощью MediaFoundationReaderRT и указав в нем стандартные настройки.Append WAV Header в NAudio

После того, как файл преобразуется в WAV PCM, когда я пытаюсь воспроизвести файл WAV, он дает коррумпированной вывод:

Вариант 1 -

WaveStream activeStream = new MediaFoundationReaderRT([Open "MyFile.mp3"]); 
WaveChannel32 waveformInputStream = new WaveChannel32(activeStream); 

waveformInputStream.Sample += inputStream_Sample; 

Я заметил, что если я прочитал звуковые данные в поток памяти (в котором он добавляет заголовок WAV с помощью «WaveFileWriter»), то все работает нормально:

Вариант 2 -

WaveStream activeStream = new MediaFoundationReaderRT([Open "MyFile.mp3"]); 

MemoryStream memStr = new MemoryStream(); 
byte[] audioData = new byte[activeStream.Length]; 
int bytesRead = activeStream.Read(audioData, 0, audioData.Length); 
memStr.Write(audioData, 0, bytesRead); 

WaveFileWriter.CreateWaveFile(memStr, audioData); 

RawSourceWaveStream rawSrcWavStr = new RawSourceWaveStream(activeStream, 
new WaveFormat(48000, 16, 2)); 
WaveChannel32 waveformInputStream = new WaveChannel32(rawSrcWavStr); 

waveformInputStream.Sample += inputStream_Sample; 

Однако чтение всего аудио в память занимает много времени. Поэтому я смотрю «Вариант 1», как указано выше.

Я пытаюсь выяснить, что именно представляет собой проблема. Разве что заголовок WAV отсутствует, что вызывает проблему?

Есть ли способ в «Варианте 1», где я могу добавить заголовок WAV к образцам данных текущего воспроизведения вместо того, чтобы преобразовывать все аудиоданные в поток памяти и затем добавлять заголовок?

ответ

2

Я не совсем уверен, почему вам нужен любой из этих вариантов. Преобразование файла MP3 в WAV довольно просто с NAudio:

using(var reader = new MediaFoundationReader("input.mp3")) 
{ 
    WaveFileWriter.CreateWaveFile("output.wav", reader); 
} 

И если вам не нужно создавать файл WAV, то ваша работа уже сделана - MediaFoundationReader уже возвращает PCM от его Read метод, так что вы можете играть прямо.

+0

Thanks Mark, Что я вижу, когда MediaFoundationReader возвращает PCM из своего метода Read, я хочу получить байты данных «2048 * 4» байтов для «текущей позиции воспроизведения». В этом случае нужно ли снова и снова устанавливать в MediaFoundationReader и читать эти данные? – user3261909

+0

Вы можете легко перемещаться в MediaMoundationReader во время воспроизведения. Помощник 'CurrentTime' в базовом классе делает это еще проще –

+0

Итак, я хочу, чтобы декодированные байты PCM соответствовали« CurrentTime ». В этом случае я бы поставил «WaveStream» на «CurrentTime». И затем, сколько минимальных байтов декодированного кадра PCM необходимо прочитать для получения декодированных данных? Это «16384 * 4»? – user3261909