FFmpeg | Пакетная обработка. Конвертирование всех файлов в папке

от
FFmpeg    batch processing, batch converting, массовая обработка, пакетное конвертирование

FFmpeg не умеет работать в пакетном режиме, поэтому приходится писать скрипты для упрощения преобразования. В этой статье напишем простой скрипт, который упростит пакетное конвертирование файлов.


ЗадачаВ папке находятся несколько видео в формате webm:
  1. video1.webm
  2. Моё прекрасное видео.webm
  3. 123.webm
  4. video2.webm
Нам нужно сконвертировать их в mp4 под таким же именем.

Содержание:
  - Конвертирование всех файлов в папке (Windows)
  - Конвертирование всех файлов в папке (Linux)

Конвертирование всех файлов в папке (Windows)Создаём текстовый файл convert.bat или convert.cmd, это будет наш первый скрипт.
Чтобы выбрать все webm файлы используется цикл for:
  1. for %%i in (*.webm) do (
  2.   echo %%i
  3. )
%%i — это переменная, куда на каждой итерации будет попадать путь к webm-файлу. Вместо i можно использовать любую другую букву латинского алфавита.
В скобках после do идут команды. В данном случае, просто выводим в консоль значение переменной %%i.
Уже можно запускать скрипт:
  1. for %i in (*.webm) do (echo %i )
  2.  
  3. (echo 123.webm )
  4. 123.webm
  5.  
  6. (echo video1.webm )
  7. video1.webm
  8.  
  9. (echo video2.webm )
  10. video2.webm
  11.  
  12. (echo Моё прекрасное видео.webm )
  13. Моё прекрасное видео.webm

Скрипт выводит имена webm-видео и сами команды. Чтобы убрать вывод команд, добавляем в начало @echo off
  1. @echo off
  2. for %%i in (*.webm) do (
  3.   echo %%i
  4. )
Запускаем и теперь видим:
  1. 123.webm
  2. video1.webm
  3. video2.webm
  4. Моё прекрасное видео.webm

Для того, чтобы заменить в имени файла webm на mp4, необходимо получить имя файла без расширения. Вот примеры:
%%i — имя файла и расширение: video1.webm
%%~ni — имя файла без расширения: video1
%%~xi — только расширение: webm
Возьмём имя файла без расширения и добавим в конец .mp4
%%~ni.mp4 — имя файла и расширение mp4: video1.mp4

Теперь попробуем таким образом выстроить команду для ffmpeg:
  1. @echo off
  2. for %%i in (*.webm) do (
  3.   echo ffmpeg -i %%i %%~ni.mp4
  4. )
Запускаем и видим:
  1. ffmpeg -i 123.webm 123.mp4
  2. ffmpeg -i video1.webm video1.mp4
  3. ffmpeg -i video2.webm video2.mp4
  4. ffmpeg -i Моё прекрасное видео.webm Моё прекрасное видео.mp4
Всё правильно подставилось и команда уже выглядит рабочей. Однако, последний файл содержит пробелы, которые служат разделением команд. Чтобы ffmpeg понял, что Моё прекрасное видео.webm и Моё прекрасное видео.mp4 это целое имя входного и выходного файлов, нужно взять эти параметры в двойные кавычки:
  1. @echo off
  2. for %%i in (*.webm) do (
  3.   echo ffmpeg -i "%%i" "%%~ni.mp4"
  4. )
  1. ffmpeg -i "123.webm" "123.mp4"
  2. ffmpeg -i "video1.webm" "video1.mp4"
  3. ffmpeg -i "video2.webm" "video2.mp4"
  4. ffmpeg -i "Моё прекрасное видео.webm" "Моё прекрасное видео.mp4"

Остаётся только убрать echo:
  1. @echo off
  2. for %%i in (*.webm) do (
  3.   ffmpeg -i "%%i" "%%~ni.mp4"
  4. )
Запускаем, и видим, что ffmpeg успешно конвертирует все webm файлы в текущей папке.

Если нужно положить результирующие файлы в отдельную папку, можно добавить
mkdir out — создаёт новую папку при старте скрипта
И добавить out/ в результирующий путь:
  1. @echo off
  2. mkdir out
  3. for %%i in (*.webm) do (
  4.   ffmpeg -i "%%i" "out/%%~ni.mp4"
  5. )


Конвертирование всех файлов в папке (Linux)Создаём текстовый файл convert.sh, это будет наш первый скрипт.
Чтобы выбрать все webm файлы используется цикл for:
  1. for file in *.webm; do
  2.   echo $file
  3. done
file — это переменная, куда на каждой итерации будет попадать путь к webm-файлу.
Между do и done идут команды. В данном случае, просто выводим в консоль значение переменной file. Знак $ используется для обращения к переменной.
Запускаем
  1. bash convert.sh
  1. 123.webm
  2. video1.webm
  3. video2.webm
  4. Моё прекрасное видео.webm

⚠️ В начало скрипта можно добавить шебанг
  1. #!/bin/bash
  2. for file in *.webm; do
  3.   echo $file
  4. done
и дать права на запуск:
  1. chmod +x convert.sh
Это позволит запускать скрипт простым указанием:
  1. ./convert.sh

Для того, чтобы заменить в имени файла webm на mp4, необходимо получить имя файла без расширения. Вот примеры:
$file / ${file} — получение значения переменной file, то есть имя и расширение: video1.webm
${file%.webm} — имя файла без расширения webm: video1
Возьмём имя файла без расширения и добавим в конец .mp4
${file%.webm}.mp4 — имя файла и расширение mp4: video1.mp4

Теперь попробуем таким образом выстроить команду для ffmpeg:
  1. #!/bin/bash
  2. for file in *.webm; do
  3.   echo ffmpeg -i $file ${file%.webm}.mp4
  4. done
Запускаем и видим:
  1. ffmpeg -i 123.webm 123.mp4
  2. ffmpeg -i video1.webm video1.mp4
  3. ffmpeg -i video2.webm video2.mp4
  4. ffmpeg -i Моё прекрасное видео.webm Моё прекрасное видео.mp4
Всё правильно подставилось и команда уже выглядит рабочей. Однако, последний файл содержит пробелы, которые служат разделением команд. Чтобы ffmpeg понял, что Моё прекрасное видео.webm и Моё прекрасное видео.mp4 это целое имя входного и выходного файлов, нужно взять эти параметры в двойные кавычки.
Остаётся только убрать echo:
  1. #!/bin/bash
  2. for file in *.webm; do
  3.   ffmpeg -i "$file" "${file%.webm}.mp4"
  4. done
Запускаем, и видим, что ffmpeg успешно конвертирует все webm файлы в текущей папке.

Если нужно положить результирующие файлы в отдельную папку, можно добавить
mkdir out — создаёт новую папку при старте скрипта
И добавить out/ в результирующий путь:
  1. #!/bin/bash
  2. mkdir out
  3. for file in *.webm; do
  4.   ffmpeg -i "$file" "out/${file%.webm}.mp4"
  5. done

  • +2
  • views 13371