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

19

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

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

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

wryrych
источник
Это вопрос сценариев и как таковой не имеет ничего общего с Ubuntu. Это не не по теме, но SO или unix.SE может быть лучше спросить.
Махеш
Благодарю. В следующий раз я постараюсь задать такой вопрос в более подходящем месте.
Wryrych

Ответы:

29

Вы говорите, что хотите «извлечь аудио из них (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
источник
Я ошибся. Я хотел иметь mp3 или ogg, но, как вы заметили, аудиокодек был другим - aac в этом примере. Так что я все равно должен их перекодировать. Большое спасибо за Вашу помощь!
Wryrych
Ваш автоматический пример разрывается с именами файлов, в которых есть пробелы, потому что вы не указали $ file в под-выражении ffprobe. Изменив его на: для файла в * mp4 * avi; выполните ffmpeg -i "$ file" -vn -acodec copy "$ file". ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; сделано Исправляет это.
Эндрю Билс
+1, но похоже, что этот ответ может использовать обновление:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Николас Рауль
ffmpegили ffprobeнедоступны для Ubuntu 14.04 или новее.
Ярно
1
@jarno Реал ffmpeg вернулся в Ubuntu в 15.04 , и, похоже, это Либав, avconvи avprobeбыл удален в 15.10 .
llogan
1

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

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

Скуби-2
источник
Это сейчас устарело. FFmpeg вернулся, а Либав ушел.
llogan
Абсолютно правильно. Если кто-то думал, что ffmpeg умрет, прочитайте это: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2