Чтение сэмплов непосредственно из конвертированного файла MP3 с помощью NAudio.

StackOverflow https://stackoverflow.com/questions/1804489

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь прочитать образцы 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-файлы, поскольку из них приятно и легко читать отдельные образцы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top