FFmpeg | Плавное затухание (fade-in, fade-out)

от
FFmpeg    fade, fade in, fade out, затухание

Разберём фильтры, при помощи которых можно делать плавное проявление/затухание видео и аудио.

Содержание:
  - fade
  - afade
  - Пример скрипта с ffprobe

fadeДля создания эффекта проявления/затухания видео, используется фильтр
fade
Он имеет короткий формат:
fade=тип:начальный_кадр:количество_кадров
либо формат с указанием параметров:
  - type / t — тип перехода (in — проявление, out — затухание)
  - start_frame / s — начальный кадр, с которого стартует эффект (по умолчанию 0)
  - nb_frames / n — количество кадров, на протяжении которых будет применяться эффект (по умолчанию 25)
  - start_time / st — время в секундах с которого стартует эффект
  - duration / d — длительность в секундах, на протяжении которой будет применяться эффект
  - color / с — цвет, накладываемый на видео. По умолчанию, чёрный.
  1. fade=in:duration=3:color=white

Добавить эффект проявления на первые 50 кадров:
  1. ffmpeg -i input.mp4 -vf fade=in:0:50 result.mp4
  1. ffmpeg -i input.mp4 -vf fade=type=in:s=0:n=50 result.mp4

Добавить эффект затухания, начиная с 750 кадра и по 800-ый:
  1. ffmpeg -i input.mp4 -vf fade=out:750:50 result.mp4
  1. ffmpeg -i input.mp4 -vf fade=t=out:start_frame=750:n=50 result.mp4

Добавить эффект проявления на первые 5 секунд:
  1. ffmpeg -i input.mp4 -vf fade=in:st=0:d=5 result.mp4

Добавить эффект проявления со второй по пятую секунды белым цветом, при этом первые 2 секунды тоже будут белые:
  1. ffmpeg -i input.mp4 -vf fade=in:st=2:d=3:color=white result.mp4

Добавить эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
  1. 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 секунд:
  1. ffmpeg -i input.mp4 -af afade=in:0:d=5 -c:v copy result.mp4
  1. ffmpeg -i input.mp4 -af afade=type=in:ss=0:duration=5 result.mp4
-c:v copy для того, чтобы не перекодировать видео

Добавить эффект затухания, начиная с пятой секунды и по 8ую:
  1. ffmpeg -i input.mp4 -af afade=out:5:d=3 -c:v copy result.mp4
  1. ffmpeg -i input.mp4 -af afade=t=out:st=5:d=3 -c:v copy result.mp4

Добавить эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
  1. ffmpeg -i input.mp4 -c:v copy -af afade=in:d=2,afade=out:st=15:d=2 result.mp4

Добавить на аудио и видео эффект проявления на первые 2 секунды и эффект затухания на 15-ую секунду, длительностью в 2 секунды:
  1. 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Проблема с эффектом затухания заключается в том, что для его применения нужно знать длительность потока. Давайте напишем скрипт, который наложит эффект проявления и затухания на переданное видео и с возможностью указания длительности эффекта.
  1. fade.cmd input.mp4 3
должен наложить эффект проявления и затухания длительностью в 3 секунды на видео и аудиопоток.

Начнём с заготовки fade.cmd:
  1. @echo off
  2. set input=%1
  3. set output=%~dpn1-fade%~x1
  4. if "%input%" == "" (
  5.   echo Usage: fade.cmd video.mp4
  6.   pause
  7.   goto :eof
  8. )
  9. set len=%2
  10. if "%len%" == "" (
  11.   set len=2
  12. )
В переменной input будет обязательный файл (если его не указать, выведем инструкцию и завершим скрипт).
В переменную output попадёт имя для выходного файла с суффиксом fade.
В переменной len будет длительность эффекта. По умолчанию, длительность будет равна двум секундам.

Теперь нужно узнать длительность видео. Воспользуемся ffprobe, чтобы получить только значение duration у потока:
  1. ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=nw=1:nk=1 "%input%"
Перенаправим вывод в файл tmp.txt, а затем прочитаем содержимое файла в переменную duration:
  1. ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=nw=1:nk=1 "%input%" > tmp.txt
  2. set /p duration=<tmp.txt
Проверим, что значение присутствует:
  1. echo %duration%
В моём случае, выводится 8.508500

Теперь рассчитаем стартовую позицию применения эффекта затухания:
  1. set /a d=duration-len
  2. echo %d%
Теперь выводится 6. Командная строка Windows не умеет работать с вещественными числами, но погрешность максимум в одну секунду не страшна.

У нас уже достаточно данных для применения эффекта:
  1. echo ffmpeg -hide_banner -v error -stats ^
  2.   -i "%input%" ^
  3.   -vf fade=in:d=%len%,fade=out:st=%d%:d=%len% ^
  4.   -af afade=in:d=%len%,afade=out:st=%d%:d=%len% ^
  5.   "%output%"
Проверим, всё ли правильно подставляется, и если да, то скрипт готов!
  1. @echo off
  2. set input=%1
  3. set output=%~dpn1-fade%~x1
  4. if "%input%" == "" (
  5.   echo Usage: fade.cmd video.mp4
  6.   pause
  7.   goto :eof
  8. )
  9. set len=%2
  10. if "%len%" == "" (
  11.   set len=2
  12. )
  13.  
  14. rem Get video duration and fade out effect start time
  15. ffprobe -v error -select_streams v:0 ^
  16.   -show_entries stream=duration ^
  17.   -of default=nw=1:nk=1 "%input%" > tmp.txt
  18. set /p duration=<tmp.txt
  19. set /a d=duration-len
  20.  
  21. ffmpeg -hide_banner -v error -stats ^
  22.   -i "%input%" ^
  23.   -vf fade=in:d=%len%,fade=out:st=%d%:d=%len% ^
  24.   -af afade=in:d=%len%,afade=out:st=%d%:d=%len% ^
  25.   "%output%"

Версия для линукса:
  1. #/bin/bash
  2. INPUT=$1
  3. OUTPUT="${1%%.*}-fade.${1#*.}"
  4. LEN=${2:-2}
  5.  
  6. DURATION=$(ffprobe -v error -select_streams v:0 \
  7.   -show_entries stream=duration \
  8.   -of default=nw=1:nk=1 "$INPUT")
  9. D=$(bc <<< "$DURATION-$LEN")
  10.  
  11. ffmpeg -hide_banner -v error -stats \
  12.   -i "$INPUT" \
  13.   -vf fade=in:d=$LEN,fade=out:st=$D:d=$LEN \
  14.   -af afade=in:d=$LEN,afade=out:st=$D:d=$LEN \
  15.   "$OUTPUT"

  • +5
  • views 6783