asp.net создает изображение формы волны из mp3 - PullRequest
2 голосов
/ 19 декабря 2009

Я ищу способ создания графического сигнала mp3-файлов, загруженных на сервер. После небольшого исследования я решил, что сначала нужно будет конвертировать mp3 в необработанный формат ... но я понятия не имею, как создать формат сигнала .gif для этого звукового файла.

90% звуковых файлов будут длиться более 60 минут.

Я понимаю, что этого нельзя будет сделать сразу после загрузки, его нужно будет поместить в очередь и обработать.

Я посмотрел несколько библиотек, таких как lame, но ни одна из них, похоже, не способна достичь того, что я ищу.

Любые указатели в правильном направлении будут с благодарностью!

Большое спасибо! Пол

Ответы [ 3 ]

11 голосов
/ 19 декабря 2009

Первый шаг - распаковать mp3. Пока вы делаете это как пакетное задание, а не используете LAME в качестве библиотеки, просто используйте существующую программу командной строки для преобразования mp3 во временный WAV-файл, что будет намного проще. Затем найдите библиотеку для чтения файлов WAV - это относительно простой формат, и вы должны найти много примеров кода в Интернете, или вы можете написать свой собственный во второй половине дня.

Предположим, ваша песня длится 60 минут: 60 минут * 60 секунд / минута * 44100 семплов / секунда = 158 760 000 семплов. (Вдвое больше, если это стереофоническая песня.) Если ваше изображение имеет ширину 1000 пикселей, вы хотите отображать только один семпл на каждые 158 760 семплов.

(Кроме того, вы не увидите много деталей в этом разрешении. Возможно, лучшим решением было бы показать форму волны всего за первые 5 минут или визуализировать увеличенное изображение, которое пользователь может прокручивать?)

В любом случае, вы хотите прочитать сэмплы аудио для каждого блока из 158 760 сэмплов (в этом примере) и отобразить его в виде вертикальной линии, представляющей силу сигнала на этой части аудио. Есть два способа сделать это:

  1. Максимальное значение *1011* для этого региона
  2. Значение среднеквадратичное (RMS) для этого региона

Максимум покажет вам пики, а RMS покажет вам общую воспринимаемую громкость. И то, и другое легко реализовать; попробуйте оба варианта и посмотрите, какой из них выглядит лучше.

Тогда вам просто нужно превратить полученное изображение в рисунок. Так как в любом случае это пакетное задание, я бы выписал BMP-файл (очень простой формат файла), а затем использовал программу командной строки, например ImageMagick «convert», чтобы превратить его в GIF.

Наконец, последнее замечание: если вы действительно хитры, вы можете читать кадры MP3 и извлекать усиление непосредственно из потока битов, не декодируя все это. Вот что я сделал здесь , и вы можете использовать его - но это не для слабонервных. Это примерно в 100 раз быстрее, чем декодирование полного MP3, но форма волны, которую вы получите, будет приблизительным приближением.

2 голосов
/ 19 декабря 2009

Вы можете обнаружить, что FMOD или BASS могут сделать это для вас, довольно легко. Я считаю, что загрузка FMOD поставляется с примером визуализации, так что вы можете экстраполировать его. Они оба читают в формате MP3 и выполняют необходимые вычисления.

1 голос
/ 19 декабря 2009

Вы можете использовать код C # здесь для генерации изображения формы волны. После этого вы должны использовать общую библиотеку System.Drawing, чтобы сохранить ее в файл GIF.

...