Первый шаг - распаковать mp3. Пока вы делаете это как пакетное задание, а не используете LAME в качестве библиотеки, просто используйте существующую программу командной строки для преобразования mp3 во временный WAV-файл, что будет намного проще. Затем найдите библиотеку для чтения файлов WAV - это относительно простой формат, и вы должны найти много примеров кода в Интернете, или вы можете написать свой собственный во второй половине дня.
Предположим, ваша песня длится 60 минут: 60 минут * 60 секунд / минута * 44100 семплов / секунда = 158 760 000 семплов. (Вдвое больше, если это стереофоническая песня.) Если ваше изображение имеет ширину 1000 пикселей, вы хотите отображать только один семпл на каждые 158 760 семплов.
(Кроме того, вы не увидите много деталей в этом разрешении. Возможно, лучшим решением было бы показать форму волны всего за первые 5 минут или визуализировать увеличенное изображение, которое пользователь может прокручивать?)
В любом случае, вы хотите прочитать сэмплы аудио для каждого блока из 158 760 сэмплов (в этом примере) и отобразить его в виде вертикальной линии, представляющей силу сигнала на этой части аудио. Есть два способа сделать это:
- Максимальное значение *1011* для этого региона
- Значение среднеквадратичное (RMS) для этого региона
Максимум покажет вам пики, а RMS покажет вам общую воспринимаемую громкость. И то, и другое легко реализовать; попробуйте оба варианта и посмотрите, какой из них выглядит лучше.
Тогда вам просто нужно превратить полученное изображение в рисунок. Так как в любом случае это пакетное задание, я бы выписал BMP-файл (очень простой формат файла), а затем использовал программу командной строки, например ImageMagick «convert», чтобы превратить его в GIF.
Наконец, последнее замечание: если вы действительно хитры, вы можете читать кадры MP3 и извлекать усиление непосредственно из потока битов, не декодируя все это. Вот что я сделал здесь , и вы можете использовать его - но это не для слабонервных. Это примерно в 100 раз быстрее, чем декодирование полного MP3, но форма волны, которую вы получите, будет приблизительным приближением.