Чтение сэмплов напрямую из преобразованного файла MP3 с помощью NAudio - PullRequest
0 голосов
/ 26 ноября 2009

Я пытаюсь прочитать образцы PCM из (преобразованного) файла MP3, используя NAudio, но не удается, поскольку метод Read возвращает ноль (указывая EOF) каждый раз.

Пример: этот фрагмент кода, который пытается прочитать один 16-битный образец, всегда печатает «0»:

using System;
using NAudio.Wave;

namespace NAudioMp3Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Mp3FileReader fr = new Mp3FileReader("MySong.mp3"))
            {
                byte[] buffer = new byte[2];
                using (WaveStream pcm = WaveFormatConversionStream.CreatePcmStream(fr))
                {
                    using (WaveStream aligned = new BlockAlignReductionStream(pcm))
                    {
                        Console.WriteLine(aligned.WaveFormat);
                        Console.WriteLine(aligned.Read(buffer, 0, 2));
                    }
                }
            }
        }
    }
}

Выход:

16 bit PCM: 44kHz 2 channels
0

Но эта версия, которая читает из файла WAV, работает нормально (я использовал iTunes, чтобы преобразовать MP3 в WAV, чтобы они содержали похожие образцы):

static void Main(string[] args)
{
    using (WaveFileReader pcm = new WaveFileReader("MySong.wav"))
    {
        byte[] buffer = new byte[2];
        using (WaveStream aligned = new BlockAlignReductionStream(pcm))
        {
            Console.WriteLine(aligned.WaveFormat);
            Console.WriteLine(aligned.Read(buffer, 0, 2));
        }
    }
}

выход:

16 bit PCM: 44kHz 2 channels
2

Что здесь происходит? Оба потока имеют одинаковые волновые форматы, поэтому я ожидал, что смогу использовать один и тот же API для чтения образцов. Установка свойства Position тоже не помогает.

1 Ответ

1 голос
/ 27 ноября 2009

Вам, вероятно, нужно читать большими кусками. NAudio использует ACM для выполнения преобразования из MP3 в WAV, и если ваш целевой буфер недостаточно велик, кодек может вообще отказаться от преобразования любых данных. Другими словами, вам нужно преобразовать блок семплов, прежде чем вы сможете прочитать первый семпл.

Файлы WAV - это другое дело, так как легко и просто прочитать из них один образец.

...