MP3 byte array-конвертировать в WAV и перейти к индексу времени?
У меня есть массив байтов, содержащий MP3-поток.
Правильно ли предположить, что этот поток должен быть дополнительно декодирован, если я хочу иметь возможность преобразовать в WAV?
В его текущем состоянии байта, возможно ли сделать базовую функциональность, такую как get / set position (Time-wise)?
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 по своему вкусу.