Я хочу передавать аудиофайлы .amr на моем сервере. Проведя несколько часов исследований, мне ясно, что это невозможно в текущем состоянии аудио html5. После этого разочаровывающего вывода я потратил несколько дополнительных часов на поиск простого способа конвертировать .amr-файлы в .ogg с аналогичными неутешительными результатами.
Я потрясен тем, что после более чем десяти лет использования нет простого способа воспроизведения / конвертирования файлов, закодированных в соответствии с этим стандартом, но может ли кто-нибудь помочь мне найти полезное решение? Ближайшие жизнеспособные варианты кажутся sox и ffmpeg . Я идеально ищут краткий набор инструкций для преобразования .amr в .ogg прямо из php, но с использованием командной строки будет хорошо.
Я собираюсь разобраться в специфике использования этих двух библиотек, но решил, что я отправлю сюда в надежде, что какая-то добродушная душа может помочь просветить других, которые находятся под временными ограничениями, и поэтому не желают проводить день, распутывая специфику использования из чего должна быть прямая задача. Если кто-то другой не опубликует, я сам отвечу на вопрос.
Вот некоторые из других «ответов», которые я нашел, которые привели меня к публикации здесь:
Если вы собираетесь отметить это как «вне темы» или закрыть вопрос по какой-либо другой причине, пожалуйста, рассмотрите следующее:
Поиск по https://superuser.com/search?q=convert+.amr+to+.ogg , который указан по крайней мере в одной из приведенных выше ссылок в качестве подходящего форума для данного вопроса (на сегодняшний день), приводит к 4 сообщений, ни один из которых даже удаленно не затрагивает этот вопрос.
Руководство по проводке SO, как мне кажется, полностью соответствует этому вопросу. Я озадачен тем, почему кто-то закрыл вопросы, которые возникли в моем поиске. Я очень опытный разработчик, задающий вопрос, непосредственно связанный с работами по развитию, которые я делаю, и был заблокирован проблемой, которую я хотел бы предложить, чтобы помочь другим разработчикам поддерживать подобные проблемы.
Тот факт, что ничто не пришло в мой поиск, чтобы спасти меня от выполнения часов исследований, заставляет меня рассматривать это как достойный вопрос для SO. Пожалуйста, помогите восстановить мои настроения для этого сайта, который является ценным ресурсом, но оставил меня холодным из-за стольких бессмысленных и, казалось бы, неизбирательных закрытий.
Благодаря…
Если вы находитесь в среде, где инструменты уже установлены, преобразование файла на самом деле является очень простой процедурой. Для ffmpeg и sox команды в их основных формах:
ffmpeg -i ./file.amr ./file.ogg
или
sox ./file.amr ./file.ogg
Поэтому, если мы загрузим файл с именем ввода «audio», с PHP это будет выглядеть примерно так:
<?php if (isset($_FILES['audio']) && is_file($TmpFile=$_FILES['audio']['tmp_name'])) { // I name uploaded files as curr ms timestamp and track file data via db. $NewFile = './uploads/'.round(microtime(true)*1000).'.ogg'; shell_exec("ffmpeg -i {$TmpFile} -acodec libvorbis ".$NewFile); // You'll want to add other file data to the database here... } else { // Deal with bad file uploads... } ?>
К сожалению, на моей серверной среде эти инструменты не установлены, поэтому я должен их скомпилировать вручную. В моем случае я использую виртуальный общий хост, поэтому у меня нет универсальных прав доступа в системе. Имейте в виду, что это отражено в некоторых из кода, который я использую для установки различных компонентов ffmpeg.
cd ~/ curl -O http://ffmpeg.org/releases/ffmpeg-2.0.tar.gz tar -xzvf ffmpeg-2.0.tar.gz mv -fv ./ffmpeg-2.0 ./ffmpeg rm -v ./ffmpeg-2.0.tar.gz cd ~/ffmpeg curl -O http://downloads.xiph.org/releases/ogg/libogg-1.3.1.tar.gz tar -xzvf libogg-1.3.1.tar.gz rm -v libogg-1.3.1.tar.gz cd libogg-1.3.1 ./configure --prefix="$HOME/ffmpeg" --disable-shared make make install make distclean cd ~/ffmpeg/ curl -O http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz tar -xzvf libvorbis-1.3.3.tar.gz rm -v libvorbis-1.3.3.tar.gz cd libvorbis-1.3.3 ./configure --prefix="$HOME/ffmpeg" --with-ogg="$HOME/ffmpeg" --disable-shared make make install make distclean cd ~/ffmpeg/ curl -O -L http://sourceforge.net/projects/opencore-amr/files/opencore-amr/opencore-amr-0.1.3.tar.gz tar -xzvf opencore-amr-0.1.3.tar.gz rm -v opencore-amr-0.1.3.tar.gz cd opencore-amr-0.1.3 ./configure --prefix="$HOME/ffmpeg" --disable-shared --bindir="$HOME/bin" make make install make distclean cd ~/ffmpeg/ curl -O http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz tar -xzvf yasm-1.2.0.tar.gz rm -v yasm-1.2.0.tar.gz cd yasm-1.2.0 ./configure --prefix="$HOME/ffmpeg" --bindir="$HOME/bin" make make install make distclean cd ~/ffmpeg/ mkdir ~/ffmpeg/tmp chmod 777 ~/ffmpeg/tmp export TMPDIR="$HOME/ffmpeg/tmp" export PKG_CONFIG_PATH="$HOME/ffmpeg/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg" --extra-cflags="-I$HOME/ffmpeg/include" --extra-ldflags="-L$HOME/ffmpeg/lib" --bindir="$HOME/bin" --extra-libs="-ldl" --enable-gpl --enable-nonfree --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvorbis make make install make distclean rm -rfv $TMPDIR export TMPDIR="" export PKG_CONFIG_PATH=""
Вы можете просто скопировать и вставить приведенные выше команды bash в оболочку, или вы можете поместить их в исполняемый скрипт, и он должен позаботиться обо всем. Вероятно, вы захотите проверить новейшие версии каждого компонента и соответственно обновить код. Вы также можете добавить другие библиотеки, если работаете с разными файловыми форматами, но это сводилось к тому, что мне нужно было конкретно.
Вы также можете использовать:
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
и исключить первый блок кода в скрипте установки, если у вас установлен git, или если у вас нет ни git, ни curl, вы можете просто загрузить их и загрузить на свой сервер или использовать fget или что-то подобное.
В целом это составляло несколько часов поиска файлов, отслеживание ошибок компиляции, отслеживание правильных вариантов моего сценария и другие аспекты такого рода скуки, которые составляют худшее из того, что мне меньше всего нравится в работе над разработкой. Я надеюсь, что этот пост может спасти других от такой ненужной боли и страданий 🙂