Як зменшити / вимкнути відео / аудіокліп із невідомою тривалістю?


19

Я працюю над проектом, де я використовую ffmpeg для пакетної конвертації деяких відеофайлів та додавання ефектів зникання / виведення в голову та хвіст кожного кліпу.

Я використовую цей біт коду, щоб додати ефект відцвітання / вимкнення кліпів із відомою тривалістю:

ffmpeg -i clip.mp4 -filter:v 'fade=in:0:30,fade=out:9650:30' -c:v libx264 -crf 22 -preset veryfast -c:a copy fadeInOut.mp4

Мої два питання:

  1. Як я можу одночасно вимкнути аудіо вхід / вихід?
  2. Чи може ffmpeg автоматично визначити тривалість кліпу і сказати, що він просто зникає останні 30 кадрів?

Спасибі!

Відповіді:


15

№1 Для одночасного вимкнення аудіо введення / виводу:

ffmpeg -i clip.mp4 -vf 'fade=in:0:30,fade=out:960:30'
                   -af 'afade=in:st=0:d=1,afade=out:st=32:d=1'
       -c:v libx264 -crf 22 -preset veryfast fadeInOut.mp4

Часи помирання в секундах .

№2 Автоматично? Ні. Але див. Вирішення нижче

Ви можете спочатку запустити ffprobe, щоб отримати тривалість.

ffprobe -i clip.mp4 -show_entries stream=codec_type,duration -of compact=p=0:nk=1

У вас вийде щось подібне:

video|13.556000
audio|13.816000

Потім ви можете скористатися вищесказаним, щоб розмістити свої завмирання. Ці часи в секундах.

Обхід

ffmpeg -i clip.mp4 -sseof -1 -copyts -i clip.mp4 -filter_complex
       "[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v];
        anullsrc,atrim=0:2[at];[0][at]acrossfade=d=1,afade=d=1[a]"
       -map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset veryfast -shortest fadeInOut.mp4

FFmpeg має sseofопцію, яка дозволяє шукати вхід з кінця. Ми можемо використовувати це для досягнення своєї мети. Таким чином, ми вводимо дані двічі, вдруге вводячи лише останню секунду. Ми кажемо FFmpeg зберегти часові позначки, щоб ffmpeg зберігав тимчасове положення цієї хвостової частини.

До цього хвоста ми застосовуємо вицвітання, а потім накладаємо результат на повний вхід. Оскільки вони є тим самим медіа-файлом, передній план повністю охоплює фон, і оскільки він copytsбув застосований, накладання відбувається на відповідний ідентичний кадр у фоновому вході.

Для аудіо ми створюємо порожній фіктивний аудіо тривалістю 2 секунди, а потім застосовуємо аудіоперехрещення від основного звуку до цього манекена. Оскільки 2-е аудіо порожнє, це фактично є згасанням основного входу. -shortestДодають , щоб залишити з частин фіктивного аудіо після того , як сталася склейка.


Це дає помилку "немає такого фільтра!" для звукового фільтра.
Felwit

1
Використовуються 4 аудіофільтри. Який? Запустіть свою команду -reportдоданим та діліться звітом.
Gyan

7

Це жахливий злом, але це може спрацювати, якщо все, що ви хочете зробити, це зникнення / вимкнення звуку, але не знаю, як довго триває кліп:

ffmpeg -i input.mp4 -filter_complex "afade=d=0.5, areverse, afade=d=0.5, areverse" output.mp4

[редагувати 2019-07-24: Зауважте, що це рішення не підходить для потокових рішень, оскільки вимагає обробляти повний трек, перш ніж перший байт може бути потоковий]

Ще один варіант, який я використовую acrossfadeз безшумною доріжкою:

ffmpeg -i input.mp4 -filter_complex "aevalsrc=0:d=0.6 [a_silence]; [0:a:0] [a_silence] acrossfade=d=0.6" output.mp4

3
Це насправді досить елегантно :-)
bk138

це чудово працює. ви могли б пояснити, як це працює. намагаються
осмислити

1
@oberhamsi: Варіант 1: Перший фільтр додає зникнення на початку треку. Потім він повертає звук і додає ще одне згасання на початку (яке насправді є кінцем). Нарешті трек знову перевертається. Варіант 2 створює безшумний трек за 0,6 секунди і перетинає його за стільки ж часу, як і оригінальний трек. Усі фільтри та їх використання задокументовані тут: ffmpeg.org/ffmpeg-filters.html (хоча я маю згоду, що це трохи криптовалюта)
marekventur

3

Відповідь на питання 2 - це ДУЖЕ! Я шукав таку ж функціональність, і я закінчив писати сценарій bash, який запитує тривалість зникнення в секундах і обчислює початковий кадр для вимкнення:

#!/bin/bash

f="$*" # all args
p="${f##*/}" # file
fn="${p%.*}" # name only
e="${p##*.}" # extension

echo
echo $f
echo $p
echo $fn
echo $e
echo

read -e -p "Number of seconds of fade-out: " -i 1 sec # prompt for fade duration in seconds

r=$(ffprobe -show_streams "$f" 2> /dev/null | grep r_frame_rate | head -1 | cut -d \= -f 2) # frame rate
let "frames = $r * $sec" # duration of fade as number of frames
echo $r
echo $sec
echo $frames
lf=$(ffprobe -show_streams "$f" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2) # total number of frames
let "lf = $lf - $frames" # initial frame to start fade at

ffmpeg -loglevel quiet -i "$f" -vf fade=out:$lf:$frames -r $r -vcodec libx264 -preset slow -crf 12 -bf 2 -flags +cgop -pix_fmt yuv420p -acodec copy "$fn $sec sec fade-out.$e"
open "$fn $sec sec fade-out.$e"

Fades вимагає повторного кодування, тому використання низького crfзначення для libx264дає якісне перекодування. У коментарях має бути пояснено все інше.


Відповідь на питання 2 - це ДУЖЕ! -> це все ще ні. Q є Чи може ffmpeg автоматично визначити тривалість ... але ви написали сценарій, який виконує кілька команд ff * для цього. Однак корисно для * nix систем.
Gyan

Я бачу, значить, ви наполягаєте на тому, що ВАША відповідь ВЖЕ є правильною? Якщо ви будете дотримуватися мого сценарію, ви побачите, що він дійсно automatically figure out the durationвикористовує ffprobe, з яким встановлено ffmpeg. Хто сказав що-небудь про будь-яке обмеження кількості команд чи *nix? Схоже, що ОП використовує версію UNIX. Ні .exeв ffmpegкоманді. Я сам використовую те, на OS Xчому побудований, UNIXале ні UNIX.
hmj6jmh

1
* Якщо ви будете дотримуватися мого сценарію, ви побачите, що він справді автоматично з'ясовується * -> ваш сценарій робить, ffmpeg - ні.
Gyan

Але ffprobeє невід’ємною частиною ffmpegрозподілу. Ви збираєте гниди, щоб зберегти обличчя IMO.
hmj6jmh

Я мав би погодитися, що щось, що робиться за допомогою скрипта bash, - це не те, що автоматично робиться ffmpeg. Але якщо це працює, це спосіб подолати цю проблему. Звідси і термін «обхідний шлях». Я не можу сказати, чи спрацьовує це, бо я, як і більшість людей там, не маю bash або unix-системи. +1 за будь-які зусилля.
ashleedawg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.