MP3 byte array-конвертировать в WAV и перейти к индексу времени?


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

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

В его текущем состоянии байта, возможно ли сделать базовую функциональность, такую как get / set position (Time-wise)?

4 2

4 ответа:

Да, 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 search .

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

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

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();
}

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

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