Библиотека сайта rus-linux.net
Пакетное конвертирование мультимедийных файлов в Linux с помощью FFMPEG
Оригинал: How to use FFMPEG to Convert Multiple Media Files At Once on Linux
Автор: Nick Congleton
Дата публикации: 7 мая 2018 года
Перевод: А. Кривошей
Дата перевода: март 2019 г.
Цель: написать простой скрипт Bash для пакетного конвертирования файлов с помощью FFMPEG
Дистрибутив: этот скрипт будет работать в любом дистрибутиве Linux
Требования: работающая система Linux с установленным FFMPEG
Соглашения:
# - требует, чтобы команда выполнялась с привилегиями root.
$ - требует, чтобы команда выполнялась от имени обычного пользователя.
Введение
FFMPEG - невероятно мощный инструмент, когда дело доходит до манипулирования и конвертации медиафайлов, но ему не хватает одной важной функции. FFMPEG не имеет возможности обрабатывать несколько файлов одновременно. Итак, что вы можете с этим поделать? Вы пользователь Linux. Вы не собираетесь сидеть и вручную вводить одну и ту же команду снова и снова, не так ли?
FFMPEG полностью скриптовый. Таким образом, вы можете написать простой Bash-скрипт для циклического просмотра содержимого указанного каталога и выполнения преобразования, которое вы хотите сделать, для каждого файла. Хотя это может звучать как что-то сложное, на самом деле это не так. В скрипте будет менее 20 строк.
Создание файла
Начнем с создания вашего файла. Вы можете сделать это в любом своем каталоге.
$ touch ffmpeg-batch.sh
Затем сделайте его исполняемым.
$ chmod +x ffmpeg-batch.sh
Откройте файл, чтобы начать писать наш скрипт.
#! /bin/bash
Создание переменных
Вам нужно будет передать несколько аргументов вашему скрипту, если вы хотите, чтобы он был достаточно гибким, чтобы обрабатывать большинство сценариев, для которых вы будете использовать FFMPEG. Для этого вам понадобится немало переменных. Конечно, вы можете использовать ввод, но это будет намного сложнее.
srcExt=$1 destExt=$2 srcDir=$3 destDir=$4 opts=$5
Всего у вас пять переменных; исходное расширение, конечное расширение, исходный каталог, целевой каталог и ваши параметры. Параметры - это любые опции, которые вы хотите использовать в команде FFMPEG. Есть и другие способы сделать это, но проще передать их как строку.
Цикл
Этот скрипт делается вокруг цикла for для перебора содержимого указанного каталога. Вам нужно создать этот цикл. Начните с пустого цикла.
for filename in FOLDER; do done
Конечно, FOLDER ничего не значит. Вам нужно настроить цикл для перебора содержимого каталога, и этот каталог хранится в srcDir. Вы также должны сказать циклу, что нужно перебирать только файлы с определенным расширением, srcExt. Итак, комбинация, которую вы ищете, выглядит так:
"$srcDir"/*.$srcExt
Символ (*) говорит о том, что действие применяется ко всем файлам, затем $srcExt задает расширение для поиска. Все вместе выглядит так:
for filename in "$srcDir"/*.$srcExt; do done
Команда FFMPEG
Вы знаете основной синтаксис FFMPEG. Все состоит из переменных. Здесь вам понадобится еще пара переменных. Чтобы получить правильные фрагменты для целевой папки и файлов, исходные имена файлов должны быть вырезаны и преобразованы. Сначала создайте новую переменную basePath и установите ее равной этому регулярному выражению: ${filename%.*}.
basePath=${filename%.*}
Выражение убирает из пути все после точки, что означает расширение. Теперь вам нужно избавиться от самого пути. Для этого установите baseName равным ${basePath##*/}.
baseName=${basePath##*/}
Это выражение заботится обо всем остальном, вплоть до самого имени файла. Сейчас вы можете собрать все кусочки, чтобы сформировать вызов FFMPEG.
ffmpeg -i "$filename" $opts "$destDir"/"$baseName"."$destExt"
Как видите, это то же самое, что и обычный вызов FFMPEG, но с использованием переменных. Самым сложным элементом является целевой путь, но он просто объединяет отдельные элементы, образуя полный путь с именем файла и расширением.
Завершение
Если вы хотите, вы можете прикрепить сообщение об успешном завершении преобразования. Бросьте его в конец вашего скрипта после цикла for.
echo "Conversion from ${srcExt} to ${destExt} complete!"
Все это должно выглядеть примерно так:
#! /bin/bash srcExt=$1 destExt=$2 srcDir=$3 destDir=$4 opts=$5 for filename in "$srcDir"/*.$srcExt; do basePath=${filename%.*} baseName=${basePath##*/} ffmpeg -i "$filename" $opts "$destDir"/"$baseName"."$destExt" done echo "Conversion from ${srcExt} to ${destExt} complete!"
Запуск скрипта
Наконец, теперь вы можете запустить свой скрипт для выполнения пакетного конвертирования файлов. Посмотрите на этот пример, чтобы увидеть, как выглядит синтаксис.
$ ffmpeg-batch.sh flac mp3 /path/to/files /path/to/dest '-ab 320k'
Заключение
Этот скрипт должен быть достаточно гибким для большинства ситуаций, включая видео. Вы можете добавить скрипт в локальный или общесистемный путь, чтобы сделать его более доступным за пределами его каталога.