Ffmpeg'de fadeIn / out efektli 5 görüntülü video oluşturun


27

5 görüntü ile ffmpeg'de 60 saniyelik bir video oluşturmak zorundayım, her görüntünün 15 saniye göstermesi gerekiyor. 15 saniye sonra, ilk görüntünün kaybolması ve 2. görüntünün kaybolması gerekir, bundan sonra 2. görüntünün kaybolması gerekir, 3. görüntünün kaybolması gerekir .. vb. Lütfen bana ffmpeg komutlarını kullanarak bunu nasıl başarabilirim?


4
Ne denedin, sonra sana yardım edebilir miyiz? Bu forum, "lütfen bana iş yapmadan cevabı ver" şeklinde değildir. Bununla birlikte, size ffmpeg solmaya ilişkin belgelere bağlantı sağlayacağım - ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio

Yanıtlar:


49

Daldırma / siyah solmaya

Crossfade yöntemi için aşağı kaydırın.

solmaya örnek

Her görüntünün 5 saniye boyunca görüntülendiği ve her birinin 1 saniye süren solmaya sahip olduğu örnek. Her görüntü girişi aynı genişliğe, yüksekliğe ve örnek boy oranına sahiptir. Boyutları değişirse, aşağıdaki örnek # 3'e bakınız.

MP4 çıkışı

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

Ses ile

Yukarıdakiyle aynı, ancak sesli:

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

Değişken veya isteğe bağlı boyutlarda giriş görüntüleri için

İlk örnek gibi, ancak genişlik x yüksekliğinde değişen giriş görüntüleri. 1280x720 kutuya sığacak şekilde yastıklı olacaktır:

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

Ped (posta kutusu / sütun kutusu) yerine kırpmak (ekranı doldurmak) veya ölçeklendirmeyi önlemek istiyorsanız, videoları statik boyuttaki oynatıcıya sığdırmak için yeniden boyutlandırmadaki örneklere bakın .

GIF çıkışı

'Den bir filtre ekler ffmpeg kullanarak bir videoyu GIF'e nasıl makul bir kalitede dönüştürebilirim?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -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,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

-loopGIF döngüsünün sayısını kontrol etmek için çıkış seçeneğini kullanın . Bu seçenek kullanılmazsa, varsayılan sonsuz döngüdür. Değeri -1döngü değil.

Seçenekler ve kullanılan filtreler:

  • -t Her girişin saniye cinsinden süresini ayarlamak için

  • -loop 1 görüntüyü ilmekler, aksi takdirde 1 kare süresi olur.

  • -framerateGiriş görüntüsü kare hızını ayarlamak için (bildirilmemişse varsayılan 25). GIF yapmak için kullanışlıdır.

  • ölçek ile ped spesifik bir girdi görüntü uyacak şekilde, (örneğin, 3. kullanılır) üniform bir boyut.

  • solma ve dışarı solmaya. dsolmaya süresidir. stbaşladığında.

  • her görüntüyü birleştirmek için (veya "birleştirmek") concat .

  • biçim MP4 çıkışı ve libx264 (o Yapınızda tarafından destekleniyorsa MP4 çıkışı için varsayılan kodlayıcı) ile kodlama eğer olmayan FFmpeg tabanlı oynatıcılar ile uyumlu bir kroma alt-örnekleminin düzeni çıkışına.

  • Bir filtre çıktısının kopyalarını yapmak için bölün . Palet gereği * her şeyi tek bir komutta yapmak için filtreler.

  • güzel görünümlü GIF yapmak için palet ve palet .


Geçişli

crossfade örneği

Her görüntünün 5 saniye boyunca görüntülendiği ve her birinin 1 saniye süren bir çapraz kenarlığa sahip olduğu örnek. Her görüntü girişi aynı genişliğe, yüksekliğe ve örnek boy oranına sahiptir. Boyutları değişirse, yukarıdaki örnek # 3'ü uyarlayın.

MP4 çıkışı

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Ses ile

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Sesli iki video arasında geçiş

Her girişten 5 saniye segmenti seçin ve 1 saniye çapraz geçiş ekleyin:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

GIF çıkışı

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

-loopGIF döngüsünün sayısını kontrol etmek için çıkış seçeneğini kullanın . Bu seçenek kullanılmazsa, varsayılan sonsuz döngüdür. Değeri -1döngü değil.


1
@ LordNeckbeard, bu cevap için teşekkürler, başka bir örnek için kullandım. İyi takip eden numara anlamış -tiçinde -loop 1 -t 1 -i 001.pngtanımlayıp tek kare süresini ve takip eden numara T/içinde filter_complexblok geçişin süresini tanımlar? Ve bu örnekteki çerçeve süresi, geçişin süresi de dahil olmak üzere sayılıyor mu?
cincplug

1
@Nisarg Bu tam bir çıktı olarak görünmüyor ve daha önce gösterdiğiniz ikisinden hangi komutun geldiğinden emin değilim. Neyse, eklemeyi dene -preset ultrafast.
llogan

1
@ LordNeckbeard Tek bir video dosyası oluşturmak için bir dizi görüntü, video klip ve bir ses parçası birleştirmem gerekiyor (tercihen ogg, ancak bu noktada daha az alakalı). Ek olarak, bitişik görüntüler arasında bazı geçiş efektleri oluşturmam gerekiyor. Bu görevin tamamını ffmpeg ve / veya diğer komut satırı araçlarını kullanarak kodlamanın bir yolu var mı? Amaç, görevi bir komut satırı arayüzü aracılığıyla otomatikleştirmektir.
Web Kullanıcısı

1
@WebUser Geçişleri muhtemelen kullanımı daha kolay olacak melt.
Ağustos'ta

2
Ffmpeg yaklaşımı benim için iyi çalışıyor; Teşekkürler! Yeni başlayanlar için sayfaya bir ipucu; içinde concat=n=9komuta parçası, 9örneğin 5 görüntüleri + görüntü arasında 4 geçişler geliyor. Farklı sayıda görüntü kullanıyorsanız, bunu buna göre ayarlamanız gerekir.
Jim Miller

4

Bir resim klasörüne giden ve ffmpeg ile bir crossfade videosu çıkaran genel bir bash betiği yazdım :

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

Betik esasen bir klasördeki görüntülere bakar ve yukarıdaki @LordNeckbeard tarafından verilen cevaba benzer bir komut yazar ve komutu yerine getirir. Bu komut dosyası, bir klasörde çok fazla resim bulunduğunda ve iç karartıcı uzun bir komutu el ile yazmak istemediğinizde yardımcı olur.


Maalesef, komut dosyanız ffmpeg 3.0.1 ile başarısız oldu, # 0 - 4 arası girdilerle dönüyor: "
Filtergraph

TobySpeight: iyi bir nokta, cevabını daha açık olması için düzenledim. Temel olarak ana fikir zaten yukarıda @ LordNeckbeard tarafından verilmiştir. Bu senaryo sadece birçok resme genellenir.
anh_ng8 21:16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.