Я пытаюсь прочитать образцы PCM из (преобразованного) файла MP3 с использованием NAudio, но сбой, поскольку метод Read
возвращает ноль (с указанием EOF) каждый раз.Чтение образцов непосредственно из конвертированного файла MP3 с использованием NAudio
Пример: этот кусок кода, который пытается прочитать одну 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
не помогает.
Я предположил, что 'BlockAlignReductionStream' сделает это. Может быть, мне нужно передать ему параметр, чтобы сообщить ему о распределении большего буфера? – finnw
Да, поток сокращения выравнивания блоков помогает вам в некоторых случаях, но, вероятно, sourceReadCount, который он вычисляет в методе Read, равен 0 или слишком низок. Было бы интересно, если вы можете отлаживать, чтобы узнать, что он вычисляет sourceReadCount как. Возможно, я могу исправить –