MP3 байтовый массив - преобразовать в WAV и перейти к индексу времени? - PullRequest
3 голосов
/ 08 августа 2010

У меня есть байтовый массив, содержащий поток MP3.

Правильно ли предположить, что этот поток необходимо будет дополнительно декодировать, если я хочу иметь возможность конвертировать в WAV?

В текущем состоянии байтов возможно ли выполнение основных функций, таких как получение / установка позиции (по времени)?

Ответы [ 4 ]

8 голосов
/ 08 августа 2010

NAudio - это библиотека .NET с открытым исходным кодом, которая может читать файлы MP3.

Для преобразования MP3 в WAV используйте код, подобный следующему:

Stream inputStream = ...;
Stream outputStream = ...;

using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(inputStream)))
using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat))
{
    byte[] bytes = new byte[waveStream.Length];
    waveStream.Read(bytes, 0, waveStream.Length);
    waveFileWriter.WriteData(bytes, 0, bytes.Length);
    waveFileWriter.Flush();
}
8 голосов
/ 08 августа 2010

Да, файлы MP3 сильно отличаются от файлов WAV. Файлы WAV содержат необработанные аудиоданные в виде выборок от начала до конца для рисования формы сигнала на выходе, точно так же, как файл растрового изображения содержит необработанные данные о пикселях слева направо, сверху вниз. Вы можете думать о WAV-файле как о растровом изображении звуковых волн - но вместо цветов пикселей он сохраняет интенсивность звука, обычно 44 100 из них в секунду, для двух каналов, если он стереофонический, и 2 байта на канал.

(Зная это, вы действительно можете рассчитать размер файла WAV-файла - для хранения 1 минуты аудио вам потребуется 60 секунд * 44100 семплов * 2 канала * 2 байта = 10,09 МБ.)

Файлы MP3 содержат математически модифицированную версию этого изображения и отбрасывают звук, который люди не могут слышать. Это работает аналогично тому, как изображения JPEG работают для сжатия изображений.

Точно так же, как видеокартам в конечном итоге нужны битовые карты для работы, так и звуковым картам, в конечном счете, нужны данные WAV для работы - так что да, вам нужен декодер.

В начале файлов Mp3 находится блок данных, называемый тегом ID3, который содержит набор основной информации о файле - имена исполнителей, длину трека, названия альбомов и тому подобное. Вы можете использовать что-то вроде C # ID3 для чтения / записи тегов ID3 ​​в C #.

Что касается самого звука, я не уверен, что есть декодеры Mp3, полностью написанные на C #. Технически нет никаких причин, по которым это невозможно сделать (это также должно быть хорошо с точки зрения производительности), но стандарт довольно слабый, а математика интенсивная, поэтому люди обычно используют для декодирования такие вещи, как FFMpeg. Некоторые идеи в этом поиске Google .

Если вам не нужно выполнять какую-либо специальную обработку и вы просто хотите воспроизвести аудио, вы можете использовать элемент WPF / Silverlight Media .

Вероятно, вы можете получить некоторые подсказки из приложения Джоша Смита Podder .

3 голосов
/ 08 августа 2010

Согласно ответу @Rei Miyasaka, существует декодер MP3, написанный на C #. С открытым исходным кодом тоже. Проверьте Mp3Sharp .

0 голосов
/ 07 сентября 2010

Вы можете использовать http://sourceforge.net/projects/mpg123net/ для декодирования mp3 в байтах [] и дальнейшего использования декодированного PCM по своему вкусу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...