Чтение сэмплов непосредственно из конвертированного файла MP3 с помощью NAudio.
Вопрос
Я пытаюсь прочитать образцы 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
собственность тоже не помогает.
Решение
Вероятно, вам придется читать большими кусками.NAudio использует ACM для преобразования MP3 в WAV, и если целевой буфер недостаточно велик, кодек может вообще отказаться конвертировать какие-либо данные.Другими словами, вам необходимо преобразовать блок сэмплов, прежде чем вы сможете прочитать первый семпл.
Другое дело WAV-файлы, поскольку из них приятно и легко читать отдельные образцы.