как я могу вырезать аудио из mp4-файлов с помощью ffmpeg без декомпрессии (автоматическое обнаружение аудиокодеков)?

Я имею 228 mp4 файлов (2,6 ГБ) и хотел бы извлечь аудио из них (mp3 или ogg). Я хочу, чтобы их выкачать – желательно с bash. Я не уверен, что все файлы используют тот же аудиокодек, что и в разные годы, начиная с 2006-2012 годов.

Я хочу пропустить их все, выбрать имя файла, обнаружить аудиокодек и использовать ffmpeg для извлечения звука.

Является ли это возможным?

Вы говорите, что хотите «извлечь аудио из них (mp3 или ogg)». Но что, если звук в файле mp4 не является одним из них? вам все равно придется перекодировать. Итак, почему бы не оставить определение формата аудио до ffmpeg?

Для преобразования одного файла:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg 

Для преобразования многих файлов:

 for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done 

Вы можете, конечно, выбрать любые параметры ffmpeg для кодирования аудио, которые вам нравятся, чтобы установить такие вещи, как биттрейт и т. Д.

Используйте -acodec libmp3lame и измените расширение с .ogg на .mp3 для mp3-кодирования.

Если вы хотите действительно извлечь аудио, вы можете просто «скопировать» звуковую дорожку в файл, используя -acodec copy . Конечно, основное отличие заключается в том, что транскодирование происходит медленно и интенсивно, а копирование происходит очень быстро, поскольку вы просто перемещаете байты из одного файла в другой. Вот как копировать только аудиодорожку (при условии, что это в формате mp3):

 ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3 

Обратите внимание, что в этом случае формат аудиофайла должен соответствовать тому, что имеет контейнер (т. Е. Если аудио является форматом AAC, вы должны сказать audiofile.aac ). Вы можете использовать команду ffprobe чтобы узнать, какой у вас кодек, это может предоставить некоторую информацию:

 ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4" 

Возможным способом автоматического разбора аудиокодека и названия аудиофайла соответственно будет:

 mkdir -p output # current directory has to contain at least one .mp4 file for vid in *.mp4; do codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")" case "$codec" in mp3 ) filetype=mp3 ;; vorbis ) filetype=ogg ;; * ) filetype= ;; esac if [ "$filetype" ]; then ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype" else ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg done 

Примечания: выходные файлы создаются в output подкаталога, который он создает в начале (при необходимости). Для других кодеков, чем mp3 и vorbis, он преобразует аудио в ogg. У Ubuntu 14.04 нет ffmpeg в стандартных репозиториях, но вы можете добавить ppa: mc3man / trusty-media repository и установить пакет ffmpeg для получения необходимого программного обеспечения. Подробнее см. Здесь .

Как заявил Николас Рауль, это требует обновления. Вот те же строки, что и roadmr, но вместо этого использовали avconv:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done