Створіть відео з 5 зображеннями з fadeIn / out ефектом у ffmpeg


21

З 5 зображень я повинен створити відео на 60 секунд у ffmpeg, кожне зображення має відображатися протягом 15 секунд. після 15 секунд, перше зображення повинно зникати, і 2-е зображення повинно зникати, після цього 2-е зображення повинно зникнути, третє зображення повинно зникнути. Будь ласка, підкажіть мені, як я можу досягти цього за допомогою команд ffmpeg.


4
Що ви намагалися, а потім ми допоможемо вам? Цей форум не є "будь ласка, дайте мені відповідь, не роблячи ніякої роботи" тип форуму. З урахуванням сказаного, я надам вам посилання на документацію ffmpeg fade - ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio

Відповіді:


42

Опустіть до чорного

fade example

Основний приклад

Приклад, де кожне зображення відображається протягом 5 секунд, і кожен має вицвітання, яке триває 1 секунду. Кожне вхідне зображення має однакову ширину, висоту та співвідношення розмірів вибірки. Якщо вони відрізняються за розміром, див. Приклад №3.

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

З аудіо

Те ж, що й вище, але з аудіо:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Для вхідних зображень з різними або довільними розмірами

Як і в першому прикладі, але з вхідними зображеннями, які відрізняються шириною x висотою. Вони будуть розміщені так, щоб вони вмістилися в поле 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Використані параметри та фільтри:

  • -t для встановлення тривалості в секундах кожного входу.

  • scale с колодки для розміщення вхідних зображень у певний, рівномірний розмір (використовується в прикладі # 3).

  • fade зникати. d - тривалість вицвітання. st це коли починається.

  • concat для об'єднання (або "приєднання") кожного зображення.

  • format для виведення схеми вибірки кольоровості, яка сумісна з гравцями на базі не-FFmpeg, якщо кодування з libx264 (кодер за замовчуванням для виводу MP4, якщо він підтримується вашою збіркою).

Кроссфейд

crossfade example

Використання melt від Мультимедійні рамки МЛТ для цього завдання може бути простіше:

melt -verbose \
-profile atsc_720p_25 \
001.png out=50 \
002.png out=75 -mix 25 -mixer luma \
003.png out=75 -mix 25 -mixer luma \
004.png out=75 -mix 25 -mixer luma \
005.png out=75 -mix 25 -mixer luma \
-consumer avformat:output.mp4 vcodec=libx264 an=1
  • Використовуйте a профілю що відповідає вашим файлам входів. Можна перелічити профілі за допомогою melt -query profiles і отримати інформацію про певний профіль, наприклад melt -query "profile=atsc_720p_25".

  • out встановлює тривалість кожного зображення. Значення в кадрах. Цей приклад використовує профіль, який встановлює частоту кадрів 25, тому 25 кадрів дорівнює 1 секунді.

  • mix встановлює тривалість вицвітання. Значення в кадрах.

  • mixer встановлює тип суміші.

  • Подивитися Документація МЛТ і Розтопити документацію для отримання додаткової інформації.


1
@LordNeckbeard, спасибі за цю відповідь, я використав його для іншого прикладу. Чи добре я зрозумів, що число наступне -t в -loop 1 -t 1 -i 001.png визначає тривалість окремих кадрів, а число наступних T/ всередині filter_complex блок визначає тривалість переходу? Чи тривалість кадру в цьому прикладі враховується, включаючи тривалість переходу чи ні?
cincplug

1
@Nisarg Це не здається повним виходом, і я не впевнений, що команда з двох ви показали раніше. У всякому разі, спробуйте додати -preset ultrafast.
llogan

1
@LordNeckbeard Мені потрібно поєднати набір зображень, відеокліпів і аудіодоріжки для створення одного відеофайлу (бажано ogg, але це менш актуально на даний момент). Крім того, мені потрібно створити деякі ефекти переходу між сусідніми зображеннями. Чи є спосіб сценарію всієї задачі за допомогою ffmpeg та / або інших інструментів командного рядка? Мета полягає в автоматизації завдання через інтерфейс командного рядка.
Web User

1
@WebUser Переходи, ймовірно, буде легше використовувати melt.
llogan

2
Підхід ffmpeg працює добре для мене; Дякую! Одна підказка для новачків на сторінку; в concat=n=9 частина команди, 9 виходить з 5 зображень у прикладі + 4 переходи між зображеннями. Якщо ви працюєте з різним числом зображень, вам потрібно буде відрегулювати його відповідно.
Jim Miller

2

Я написав загальний скрипт bash, який займає шлях до папку зображень і виводить відео з крос-фейдом з ffmpeg:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Скрипт по суті дивиться на зображення в папці і друкує команду, схожу на відповідь @LordNeckbeard вище, і виконує команду. Цей скрипт допомагає, коли у вас є багато зображень у папці і не потрібно вручну вводити депресивно довгу команду.


Вибачте, але сценарій не працює з ffmpeg 3.0.1, з входами # 0 до # 4 повертається: "Недійсний індекс файлу 5 у описі фільтра"
Krzysztof Bociurko

TobySpeight: хороший момент, я відредагував відповідь, щоб бути більш ясним. В основному головна ідея вже дана @LordNeckbeard вище. Цей сценарій просто узагальнює багато зображень.
anh_ng8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.