C# чтение данных PCM из mp3 файла останавливается до завершения
Я пытаюсь читать только данные mp3-файлов через NAudio, я использую WaveStream, я запрашиваю длину WaveStream и выделяю byte[] в соответствии с этой длиной. И когда я пытаюсь прочитать весь поток сразу, и в результате получается исключение: "Дополнительная информация: недостаточно места в буфере"
using (Mp3FileReader fr = new Mp3FileReader(@"C:\Users\AmitL\Desktop\The Fabulous Thunderbirds - Powerful Stuff.mp3"))
{
byte[] buffer = new byte[2];
long l_lLen = fr.Length;
Console.WriteLine("mp3 length" + l_lLen.ToString());
using (WaveStream pcm = WaveFormatConversionStream.CreatePcmStream(fr))
{
long l_lLenPCM = pcm.Length;
int l_dLenPCM = Convert.ToInt32(l_lLenPCM);
byte[] l_bData = new byte[l_dLenPCM];
Console.WriteLine("l_bData len: " + l_bData.Length.ToString());
Console.WriteLine("l_dLenPCM: " + l_dLenPCM.ToString());
Console.WriteLine("l_bData[l_bData.Length - 1]: " + l_bData[l_bData.Length - 1].ToString());
using (WaveStream aligned = new BlockAlignReductionStream(pcm))
{
Console.WriteLine("aligned.Length" + aligned.Length);
Console.WriteLine("aligned.Read: " + aligned.Read(l_bData, 0 , l_dLenPCM ));
}
}
}
выход: mp3 длина 4377442 l_bData len: 126074880 l_dLenPCM: 126074880 l_bData[l_bData.Length - 1]: 0 выровнен.Length126074880
И когда я пытаюсь прочитать поток на итерациях, он прекращает чтение после 382 итераций чтения 126074 байт и еще одного окончательного чтения 103924 байт...???? просто замените строку, в которой я прочитал:
for (int i = 0; i < 500; i++)
{
Console.WriteLine("i: " + i.ToString() + "aligned.Read : " + aligned.Read(l_bData, (l_dLenPCM / 1000) * i, l_dLenPCM / 1000));
}
Кто-нибудь знает, что я делаю не так?
1 ответ
Во-первых, нет необходимости использовать WaveFormatConversionStream
или же BlockAlignReductionStream
с Mp3FileReader
, Просто позвони Read
и вы получите PCM
Во-вторых, не пытайтесь читать целые файлы MP3 за один раз, поскольку данные должны передаваться через кодек, который может иметь ограниченный размер буфера. Вместо этого позвоните Read
в цикле, пока не вернет 0, указывающий конец файла. Секунда за раз - хорошее эмпирическое правило для определения Read
размер буфера. Вы можете использовать AverageBytesPerSecond
собственность WaveFormat
из Mp3FileReader
чтобы получить этот размер байта.