FFmpeg | Пакетная обработка. Рекурсивное наложение логотипа
от aNNiMON
Теперь сделаем скрипт для обработки файлов во вложенных папках.
ЗадачаВ папке находится файл 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)