FFmpeg | Плавное затухание (fade-in, fade-out)
от aNNiMON
Разберём фильтры, при помощи которых можно делать плавное проявление/затухание видео и аудио.
Содержание:
- fade
- afade
- Пример скрипта с ffprobe
fadeДля создания эффекта проявления/затухания видео, используется фильтр
fade
Он имеет короткий формат:
fade=тип:начальный_кадр:количество_кадров
либо формат с указанием параметров:
- type / t — тип перехода (in — проявление, out — затухание)
- start_frame / s — начальный кадр, с которого стартует эффект (по умолчанию 0)
- nb_frames / n — количество кадров, на протяжении которых будет применяться эффект (по умолчанию 25)
- start_time / st — время в секундах с которого стартует эффект
- duration / d — длительность в секундах, на протяжении которой будет применяться эффект
- color / с — цвет, накладываемый на видео. По умолчанию, чёрный.
Добавить эффект проявления на первые 50 кадров:
Добавить эффект затухания, начиная с 750 кадра и по 800-ый:
Добавить эффект проявления на первые 5 секунд:
Добавить эффект проявления со второй по пятую секунды белым цветом, при этом первые 2 секунды тоже будут белые:
Добавить эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
afadeДля создания эффекта проявления/затухания аудио, используется фильтр
afade
Параметры:
- type / t — тип перехода (in — проявление, out — затухание)
- start_sample / ss — начальный сэмпл, с которого стартует эффект (по умолчанию 0)
- nb_samples / ns — количество сэмплов, на протяжении которых будет применяться эффект (по умолчанию 44100)
- start_time / st — время в секундах с которого стартует эффект
- duration / d — длительность в секундах, на протяжении которой будет применяться эффект
- curve / с — кривая перехода. По умолчанию имеет значение tri (линейный переход). Может принимать значения:
tri, qsin, hsin, esin, log, ipar, qua, cub, squ, cbr, par, exp, iqsin, ihsin, dese, desi, losi, sinc, isinc, nofade
Добавить эффект проявления на первые 5 секунд:
-c:v copy для того, чтобы не перекодировать видео
Добавить эффект затухания, начиная с пятой секунды и по 8ую:
Добавить эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
Добавить на аудио и видео эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
Пример скрипта с ffprobeПроблема с эффектом затухания заключается в том, что для его применения нужно знать длительность потока. Давайте напишем скрипт, который наложит эффект проявления и затухания на переданное видео и с возможностью указания длительности эффекта.
должен наложить эффект проявления и затухания длительностью в 3 секунды на видео и аудиопоток.
Начнём с заготовки fade.cmd:
В переменной input будет обязательный файл (если его не указать, выведем инструкцию и завершим скрипт).
В переменную output попадёт имя для выходного файла с суффиксом fade.
В переменной len будет длительность эффекта. По умолчанию, длительность будет равна двум секундам.
Теперь нужно узнать длительность видео. Воспользуемся ffprobe, чтобы получить только значение duration у потока:
Перенаправим вывод в файл tmp.txt, а затем прочитаем содержимое файла в переменную duration:
Проверим, что значение присутствует:
В моём случае, выводится 8.508500
Теперь рассчитаем стартовую позицию применения эффекта затухания:
Теперь выводится 6. Командная строка Windows не умеет работать с вещественными числами, но погрешность максимум в одну секунду не страшна.
У нас уже достаточно данных для применения эффекта:
Проверим, всё ли правильно подставляется, и если да, то скрипт готов!
Версия для линукса:
Следующая статья →Содержание:
- fade
- afade
- Пример скрипта с ffprobe
fadeДля создания эффекта проявления/затухания видео, используется фильтр
fade
Он имеет короткий формат:
fade=тип:начальный_кадр:количество_кадров
либо формат с указанием параметров:
- type / t — тип перехода (in — проявление, out — затухание)
- start_frame / s — начальный кадр, с которого стартует эффект (по умолчанию 0)
- nb_frames / n — количество кадров, на протяжении которых будет применяться эффект (по умолчанию 25)
- start_time / st — время в секундах с которого стартует эффект
- duration / d — длительность в секундах, на протяжении которой будет применяться эффект
- color / с — цвет, накладываемый на видео. По умолчанию, чёрный.
- fade=in:duration=3:color=white
Добавить эффект проявления на первые 50 кадров:
- ffmpeg -i input.mp4 -vf fade=in:0:50 result.mp4
- ffmpeg -i input.mp4 -vf fade=type=in:s=0:n=50 result.mp4
Добавить эффект затухания, начиная с 750 кадра и по 800-ый:
- ffmpeg -i input.mp4 -vf fade=out:750:50 result.mp4
- ffmpeg -i input.mp4 -vf fade=t=out:start_frame=750:n=50 result.mp4
Добавить эффект проявления на первые 5 секунд:
- ffmpeg -i input.mp4 -vf fade=in:st=0:d=5 result.mp4
Добавить эффект проявления со второй по пятую секунды белым цветом, при этом первые 2 секунды тоже будут белые:
- ffmpeg -i input.mp4 -vf fade=in:st=2:d=3:color=white result.mp4
Добавить эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
- ffmpeg -i input.mp4 -vf fade=in:d=2,fade=out:st=15:d=2 result.mp4
afadeДля создания эффекта проявления/затухания аудио, используется фильтр
afade
Параметры:
- type / t — тип перехода (in — проявление, out — затухание)
- start_sample / ss — начальный сэмпл, с которого стартует эффект (по умолчанию 0)
- nb_samples / ns — количество сэмплов, на протяжении которых будет применяться эффект (по умолчанию 44100)
- start_time / st — время в секундах с которого стартует эффект
- duration / d — длительность в секундах, на протяжении которой будет применяться эффект
- curve / с — кривая перехода. По умолчанию имеет значение tri (линейный переход). Может принимать значения:
tri, qsin, hsin, esin, log, ipar, qua, cub, squ, cbr, par, exp, iqsin, ihsin, dese, desi, losi, sinc, isinc, nofade
Добавить эффект проявления на первые 5 секунд:
- ffmpeg -i input.mp4 -af afade=in:0:d=5 -c:v copy result.mp4
- ffmpeg -i input.mp4 -af afade=type=in:ss=0:duration=5 result.mp4
Добавить эффект затухания, начиная с пятой секунды и по 8ую:
- ffmpeg -i input.mp4 -af afade=out:5:d=3 -c:v copy result.mp4
- ffmpeg -i input.mp4 -af afade=t=out:st=5:d=3 -c:v copy result.mp4
Добавить эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
- ffmpeg -i input.mp4 -c:v copy -af afade=in:d=2,afade=out:st=15:d=2 result.mp4
Добавить на аудио и видео эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
- ffmpeg -i input.mp4 -vf fade=in:d=2,fade=out:st=15:d=2 -af afade=in:d=2,afade=out:st=15:d=2 result.mp4
Пример скрипта с ffprobeПроблема с эффектом затухания заключается в том, что для его применения нужно знать длительность потока. Давайте напишем скрипт, который наложит эффект проявления и затухания на переданное видео и с возможностью указания длительности эффекта.
- fade.cmd input.mp4 3
Начнём с заготовки fade.cmd:
- @echo off
- set input=%1
- set output=%~dpn1-fade%~x1
- if "%input%" == "" (
- echo Usage: fade.cmd video.mp4
- pause
- goto :eof
- )
- set len=%2
- if "%len%" == "" (
- set len=2
- )
В переменную output попадёт имя для выходного файла с суффиксом fade.
В переменной len будет длительность эффекта. По умолчанию, длительность будет равна двум секундам.
Теперь нужно узнать длительность видео. Воспользуемся ffprobe, чтобы получить только значение duration у потока:
- ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=nw=1:nk=1 "%input%"
- ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=nw=1:nk=1 "%input%" > tmp.txt
- set /p duration=<tmp.txt
- echo %duration%
Теперь рассчитаем стартовую позицию применения эффекта затухания:
- set /a d=duration-len
- echo %d%
У нас уже достаточно данных для применения эффекта:
- echo ffmpeg -hide_banner -v error -stats ^
- -i "%input%" ^
- -vf fade=in:d=%len%,fade=out:st=%d%:d=%len% ^
- -af afade=in:d=%len%,afade=out:st=%d%:d=%len% ^
- "%output%"
- @echo off
- set input=%1
- set output=%~dpn1-fade%~x1
- if "%input%" == "" (
- echo Usage: fade.cmd video.mp4
- pause
- goto :eof
- )
- set len=%2
- if "%len%" == "" (
- set len=2
- )
- rem Get video duration and fade out effect start time
- ffprobe -v error -select_streams v:0 ^
- -show_entries stream=duration ^
- -of default=nw=1:nk=1 "%input%" > tmp.txt
- set /p duration=<tmp.txt
- set /a d=duration-len
- ffmpeg -hide_banner -v error -stats ^
- -i "%input%" ^
- -vf fade=in:d=%len%,fade=out:st=%d%:d=%len% ^
- -af afade=in:d=%len%,afade=out:st=%d%:d=%len% ^
- "%output%"
Версия для линукса:
- #/bin/bash
- INPUT=$1
- OUTPUT="${1%%.*}-fade.${1#*.}"
- LEN=${2:-2}
- DURATION=$(ffprobe -v error -select_streams v:0 \
- -show_entries stream=duration \
- -of default=nw=1:nk=1 "$INPUT")
- D=$(bc <<< "$DURATION-$LEN")
- ffmpeg -hide_banner -v error -stats \
- -i "$INPUT" \
- -vf fade=in:d=$LEN,fade=out:st=$D:d=$LEN \
- -af afade=in:d=$LEN,afade=out:st=$D:d=$LEN \
- "$OUTPUT"
Объединение файлов, слайдшоу (concat)