FFmpeg | Пакетная обработка. Рекурсивное наложение логотипа
от aNNiMON
FFmpeg
batch processing, batch converting, массовая обработка, пакетное конвертирование, вложенные папки, рекурсивно, recursive
Теперь сделаем скрипт для обработки файлов во вложенных папках.
ЗадачаВ папке находится файл logo.png, а также несколько вложенных папок, в которых есть видео в формате mp4:
Для каждого такого видео нужно наложить логотип в правый нижний угол и сохранить с именем, в котором будет суффикс -logo. Например, было видео3.mp4, а станет видео3-logo.mp4
Содержание:
- Рекурсивное наложение логотипа (Windows)
- Рекурсивное наложение логотипа (Linux)
Рекурсивное наложение логотипа (Windows)Воспользуемся скриптом, который мы написали в прошлой статье и сразу же заменим в нём webm на mp4, так как теперь работать будем именно с этими файлами.
Создаём текстовый файл add-logo.bat или add-logo.cmd:
Сейчас он находит только файлы в текущей папке. Чтобы добавить поиск по вложенным папкам, необходимо после for прописать ключ /r
Запускаем скрипт:
Половина дела сделана. Теперь добавим уже знакомый нам фильтр overlay:
Логотип будет накладываться с отступом в 20 пикселей от правого нижнего края.
%%~dpni получает путь к файлу без расширения
d - drive (буква диска), p - path (основной путь), n - имя файла без расширения.
Скрипт уже можно считать рабочим. Но хотелось бы вынести параметры куда-нибудь повыше, чтобы не искать их в скрипте (особенно, если он будет большим).
Можно вынести имя файла логотипа в отдельную переменную. Чтобы объявить переменную, используем:
чтобы указать переменную в скрипте, используем:
Можно вынести ещё и позицию логотипа:
Запускаем и проверяем, что все данные правильно подставились. Вообще, запускайте как можно чаще при небольших изменениях, это даст понять, что на предыдущем шаге что-то пошло не так.
Напоследок, давайте добавим возможность указывать файл логотипа параметром к скрипту. Если скрипт запущен без параметров, то пусть используется logo.png.
%1 — первый параметр, который пришёл скрипту.
if "%logo%" == "" — проверяет, является ли значение логотипа пустым или нет. Если является, то выполняется строка в скобках, которая устанавливает переменной logo значение logo.png
При таком подходе можно будет либо перетягивать файл логотипа на файл скрипта и получать готовые видео, либо указывать файл из командной строки:
Готовый скрипт:
-hide_banner убирает информацию о версии ffmpeg.
Рекурсивное наложение логотипа (Linux)Воспользуемся скриптом, который мы написали в прошлой статье и сразу же заменим в нём webm на mp4, так как теперь работать будем именно с этими файлами.
Создаём текстовый файл add-logo.sh:
Сейчас он находит только файлы в текущей папке. Чтобы добавить поиск по вложенным папкам, необходимо воспользоваться утилитой find:
Запускаем скрипт:
Половина дела сделана. Теперь добавим уже знакомый нам фильтр overlay:
Логотип будет накладываться с отступом в 20 пикселей от правого нижнего края.
Скрипт уже можно считать рабочим. Но хотелось бы вынести параметры куда-нибудь повыше, чтобы не искать их в скрипте (особенно, если он будет большим).
Можно вынести имя файла логотипа в отдельную переменную. Чтобы объявить переменную, используем:
чтобы указать переменную в скрипте, используем:
Можно вынести ещё и позицию логотипа:
Запускаем и проверяем, что все данные правильно подставились. Вообще, запускайте как можно чаще при небольших изменениях, это даст понять, что на предыдущем шаге что-то пошло не так.
⚠️ Если ffmpeg выдаёт
нужно после команды ffmpeg добавить < /dev/null
Напоследок, давайте добавим возможность указывать файл логотипа параметром к скрипту. Если скрипт запущен без параметров, то пусть используется logo.png.
$1 или ${1} — первый параметр, который пришёл скрипту.
${1:-logo.png} — специальная конструкция Bash, которая устанавливает значение по умолчанию (logo.png) в случае, если первый параметр пуст.
При таком подходе можно будет указывать файл из командной строки:
Готовый скрипт:
-hide_banner убирает информацию о версии ffmpeg.
Следующая статья →ЗадачаВ папке находится файл logo.png, а также несколько вложенных папок, в которых есть видео в формате mp4:
- folder/
- - logo.png
- - video1.mp4
- folder2/
- - видео 2.mp4
- Новая папка/
- - видео3.mp4
- - videos/
- - video 4.mp4
Содержание:
- Рекурсивное наложение логотипа (Windows)
- Рекурсивное наложение логотипа (Linux)
Рекурсивное наложение логотипа (Windows)Воспользуемся скриптом, который мы написали в прошлой статье и сразу же заменим в нём webm на mp4, так как теперь работать будем именно с этими файлами.
Создаём текстовый файл add-logo.bat или add-logo.cmd:
- @echo off
- for %%i in (*.mp4) do (
- echo ffmpeg -i "%%i" "%%~ni.mp4"
- )
Сейчас он находит только файлы в текущей папке. Чтобы добавить поиск по вложенным папкам, необходимо после for прописать ключ /r
- @echo off
- for /r %%i in (*.mp4) do (
- echo ffmpeg -i "%%i" "%%~ni.mp4"
- )
- ffmpeg -i "R:\vid\folder\video1.mp4" "video1.mp4"
- ffmpeg -i "R:\vid\folder2\видео 2.mp4" "видео 2.mp4"
- ffmpeg -i "R:\vid\Новая папка\видео3.mp4" "видео3.mp4"
- ffmpeg -i "R:\vid\Новая папка\videos\video 4.mp4" "video 4.mp4"
Половина дела сделана. Теперь добавим уже знакомый нам фильтр overlay:
- @echo off
- for /r %%i in (*.mp4) do (
- echo ffmpeg -y -i "%%i" -i logo.png ^
- -filter_complex "[0:v][1:v]overlay=W-w-20:H-h-20" ^
- "%%~dpni-logo.mp4"
- )
%%~dpni получает путь к файлу без расширения
d - drive (буква диска), p - path (основной путь), n - имя файла без расширения.
Скрипт уже можно считать рабочим. Но хотелось бы вынести параметры куда-нибудь повыше, чтобы не искать их в скрипте (особенно, если он будет большим).
Можно вынести имя файла логотипа в отдельную переменную. Чтобы объявить переменную, используем:
- set logo=logo.png
- %logo%
- @echo off
- set logo=logo.png
- set logo_x=W-w-20
- set logo_y=H-h-20
- for /r %%i in (*.mp4) do (
- echo ffmpeg -y -i "%%i" -i %logo% ^
- -filter_complex "[0:v][1:v]overlay=%logo_x%:%logo_y%" ^
- "%%~dpni-logo.mp4"
- )
Запускаем и проверяем, что все данные правильно подставились. Вообще, запускайте как можно чаще при небольших изменениях, это даст понять, что на предыдущем шаге что-то пошло не так.
Напоследок, давайте добавим возможность указывать файл логотипа параметром к скрипту. Если скрипт запущен без параметров, то пусть используется logo.png.
- set logo=%1
- if "%logo%" == "" (
- set logo=logo.png
- )
if "%logo%" == "" — проверяет, является ли значение логотипа пустым или нет. Если является, то выполняется строка в скобках, которая устанавливает переменной logo значение logo.png
При таком подходе можно будет либо перетягивать файл логотипа на файл скрипта и получать готовые видео, либо указывать файл из командной строки:
- add-logo.cmd 123.png
Готовый скрипт:
- @echo off
- set logo=%1
- if "%logo%" == "" (
- set logo=logo.png
- )
- set logo_x=W-w-20
- set logo_y=H-h-20
- for /r %%i in (*.mp4) do (
- ffmpeg -y -hide_banner -i "%%i" -i %logo% ^
- -filter_complex "[0:v][1:v]overlay=%logo_x%:%logo_y%" ^
- "%%~dpni-logo.mp4"
- )
Рекурсивное наложение логотипа (Linux)Воспользуемся скриптом, который мы написали в прошлой статье и сразу же заменим в нём webm на mp4, так как теперь работать будем именно с этими файлами.
Создаём текстовый файл add-logo.sh:
- #!/bin/bash
- for file in *.mp4; do
- echo ffmpeg -i "$file" "${file%.mp4}.mp4"
- done
Сейчас он находит только файлы в текущей папке. Чтобы добавить поиск по вложенным папкам, необходимо воспользоваться утилитой find:
- #!/bin/bash
- find . -type f -iname "*.mp4" -print0 | while read -d $'\0' file; do
- echo ffmpeg -i "$file" "${file%.mp4}.mp4"
- done
- ffmpeg -i ./folder/video1.mp4 ./folder/video1.mp4
- ffmpeg -i ./folder2/видео 2.mp4 ./folder2/видео 2.mp4
- ffmpeg -i ./Новая папка/videos/video 4.mp4 ./Новая папка/videos/video 4.mp4
- ffmpeg -i ./Новая папка/видео3.mp4 ./Новая папка/видео3.mp4
Половина дела сделана. Теперь добавим уже знакомый нам фильтр overlay:
- #!/bin/bash
- find . -type f -iname "*.mp4" -print0 | while read -d $'\0' file; do
- echo ffmpeg -y -i "$file" -i logo.png \
- -filter_complex "[0:v][1:v]overlay=W-w-20:H-h-20" \
- "${file%.mp4}-logo.mp4"
- done
Скрипт уже можно считать рабочим. Но хотелось бы вынести параметры куда-нибудь повыше, чтобы не искать их в скрипте (особенно, если он будет большим).
Можно вынести имя файла логотипа в отдельную переменную. Чтобы объявить переменную, используем:
- logo=logo.png
- $logo
- #!/bin/bash
- logo=logo.png
- logo_x=W-w-20
- logo_y=H-h-20
- find . -type f -iname "*.mp4" -print0 | while read -d $'\0' file; do
- echo ffmpeg -y -i "$file" -i $logo \
- -filter_complex "[0:v][1:v]overlay=$logo_x:$logo_y" \
- "${file%.mp4}-logo.mp4"
- done
Запускаем и проверяем, что все данные правильно подставились. Вообще, запускайте как можно чаще при небольших изменениях, это даст понять, что на предыдущем шаге что-то пошло не так.
⚠️ Если ffmpeg выдаёт
- error parsing debug value
- debug=0
- ffmpeg -i $file ... out.mp4 < /dev/null
Напоследок, давайте добавим возможность указывать файл логотипа параметром к скрипту. Если скрипт запущен без параметров, то пусть используется logo.png.
- logo=${1:-logo.png}
${1:-logo.png} — специальная конструкция Bash, которая устанавливает значение по умолчанию (logo.png) в случае, если первый параметр пуст.
При таком подходе можно будет указывать файл из командной строки:
- ./add-logo 123.png
Готовый скрипт:
- #!/bin/bash
- logo=${1:-logo.png}
- logo_x=W-w-20
- logo_y=H-h-20
- find . -type f -iname "*.mp4" -print0 | while read -d $'\0' file; do
- ffmpeg -y -hide_banner -i "$file" -i $logo \
- -filter_complex "[0:v][1:v]overlay=$logo_x:$logo_y" \
- "${file%.mp4}-logo.mp4" < /dev/null
- done
Плавное затухание (fade-in, fade-out)