2009-11-26 2 views
0

Я пытаюсь прочитать образцы 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 не помогает.

ответ

1

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

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

+0

Я предположил, что 'BlockAlignReductionStream' сделает это. Может быть, мне нужно передать ему параметр, чтобы сообщить ему о распределении большего буфера? – finnw

+0

Да, поток сокращения выравнивания блоков помогает вам в некоторых случаях, но, вероятно, sourceReadCount, который он вычисляет в методе Read, равен 0 или слишком низок. Было бы интересно, если вы можете отлаживать, чтобы узнать, что он вычисляет sourceReadCount как. Возможно, я могу исправить –