Я пытаюсь преобразовать аудиофайлы 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 к образцам данных текущего воспроизведения вместо того, чтобы преобразовывать все аудиоданные в поток памяти и затем добавлять заголовок?
Thanks Mark, Что я вижу, когда MediaFoundationReader возвращает PCM из своего метода Read, я хочу получить байты данных «2048 * 4» байтов для «текущей позиции воспроизведения». В этом случае нужно ли снова и снова устанавливать в MediaFoundationReader и читать эти данные? – user3261909
Вы можете легко перемещаться в MediaMoundationReader во время воспроизведения. Помощник 'CurrentTime' в базовом классе делает это еще проще –
Итак, я хочу, чтобы декодированные байты PCM соответствовали« CurrentTime ». В этом случае я бы поставил «WaveStream» на «CurrentTime». И затем, сколько минимальных байтов декодированного кадра PCM необходимо прочитать для получения декодированных данных? Это «16384 * 4»? – user3261909