FFmpeg ile görüntülerden video nasıl oluşturulur?


165
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Bu satır iyi çalıştı ancak başka bir klasördeki görüntülerden bir video dosyası oluşturmak istiyorum. Klasörümdeki resim adları:

img001.jpg
img002.jpg
img003.jpg
...

Farklı bir klasörden görüntü dosyalarını nasıl girebilirim? Misal:C:\mypics

Bu komutu denedim ancak ffmpegyalnızca ilk görüntüyle (img001.jpg) bir video oluşturdum.

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Yanıtlar:


169

Bkz görüntülerden video slayt gösterisi oluşturma - FFmpeg

Videonuz kareleri doğru göstermiyorsa İlk resim atlanır veya yalnızca bir kare gösterilir gibi sorunlarla karşılaşırsanız , çıkış kare hızı için -r yerine fps video filtresini kullanın

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Alternatif olarak format videosu filtresi -pix_fmt yuv420p yerine "fps = 25, format = yuv420p" gibi filtre zincirine eklenebilir . Bu yöntemin avantajı, hangi filtrenin önce gideceğini kontrol edebilmenizdir

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Aşağıdaki parametreleri test ettim, benim için çalıştı

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

Aşağıdaki parametreler de çalıştı ancak her zaman ilk resmi atlıyor

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

farklı klasörlere yerleştirilmiş görüntülerden video yapma

İlk olarak, imagepaths.txt dosyasına aşağıdaki gibi resim yolları ekleyin .

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Örnek kullanım aşağıdaki gibidir;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0 parametresi Güvenli Olmayan dosya adı hatasını önler

İlgili Bağlantılar

FFmpeg farklı klasörlere yerleştirilmiş görüntülerden video yapma

FFMPEG Bir Ara Kılavuz / görüntü dizisi

Birleştir - FFmpeg


"Videonuz kareleri doğru göstermiyorsa İlk resim atlanıyor veya yalnızca bir kare gösteriyor gibi sorunlarla karşılaşırsanız, bunun yerine fps video filtresini kullanın" Üzgünüz ama ne demek istediğini açıklayabilir misin "fps video filtresi "tam olarak?
arnuschky

3
Bildiğim kadarıyla –r parametresi değişken kare hızıdır, bu, FFMPEG'in istenen çıkış kare hızına ulaşmak için kareleri düşürebileceği veya çoğaltabileceği anlamına gelir. Fps filtresi “-vf fps = value” kullanarak FFMPEG'i sabit kare hızı üretmeye zorlar. Bkz . Görüntülerden video slayt gösterisi oluşturma - FFmpeg , ve bu -r ile fps filtresi arasındaki (teknik) fark nedir? . Yani -r parametresini kullanmak bazen ilk görüntüyü atlamaya neden olabilir ..
khan

Bu listedeki ilk komut, ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4işe yaramış gibi görünüyordu, ancak sonunda herhangi bir oyuncu tarafından okunamayan bir videoyla sonuçlandı (Ubuntu'da). VNC, "moov atomu bulunamadı" dedi. İle bu durumu düzeltmek için çalışıyorum qt-faststarthata üretilen "dosyasındaki son atomu bir film atomu değildi"
sh37211

149

-pattern_type glob

Bu harika seçenek, birçok durumda görüntüleri seçmeyi kolaylaştırır.

Saniyede bir resim içeren slayt gösterisi videosu

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Biraz müzik ekleyin, görüntüler sona erdiğinde muhtemelen daha uzun bir ses çıkardığında kesin:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

İşte YouTube'da iki demo:

Hippi olun ve Theora patentli numaralandırılmamış video formatını kullanın :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Resimleriniz elbette alfabetik olarak sıralanmalıdır:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

ve bunun gibi.

Öncelikle, kullanılacak tüm görüntülerin, muhtemelen önceden imagemagickveya nomacs ile kırparak aynı en boy oranına sahip olmasını sağlarım , böylece ffmpeg zor kararlar vermek zorunda kalmaz. Özellikle, genişlik 2 ile bölünebilir olmalıdır, aksi takdirde dönüşüm başarısız olur: "genişlik 2 ile bölünemez".

30 FPS'de kare başına bir görüntü ile normal hızlı video

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

İşte böyle görünüyor:

İle oluşturulan GIF: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Ses ekleyin:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Sonuç: https://www.youtube.com/watch?v=HG7c7lldhM4

Bunlar kullandığım test ortamları:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Şununla oluşturulan resimler: Bir dosyaya dönüştürmek için GLUT / OpenGL nasıl kullanılır?

Özel algoritmalarla kareler arasında sıkıştırabildiğinden, videonun görüntü dizisini ZIP'den daha iyi sıkıştırdığını gözlemlemek harika:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7,3 milyon

YouTube yüklemesi için bir müzik dosyasını sabit bir resme sahip bir videoya dönüştürün

Yanıt verildi: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Adım adım tam gerçekçi slayt gösterisi vaka çalışması kurulumu

Slayt gösterileri oluşturmak için tek bir ffmpeg komutu çalıştırmaktan biraz daha fazlası var, bu yüzden bu zaman çizelgesinden ilham alan daha ilginç ve ayrıntılı bir örnek var .

Giriş ortamını alın:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

Şimdi, son en boy oranına karar vermek için tüm görüntü boyutlarına hızlı bir şekilde bakıyoruz:

identify png/*

hangi çıktılar:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

klasik 480p (640x480 == 4/3) en boy oranı uygun görünüyor.

Genişlikleri eşit hale getirmek için minimum yeniden boyutlandırma ile tek bir dönüşüm yapın (TODO herhangi bir genişlik için otomatikleştirilir, burada manuel olarak identifyçıktıya ve genişlik ve yüksekliği birer birer azalttım):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Bu, korkunç bir çıktı üretir, çünkü aşağıdakilerden görüldüğü gibi:

ffprobe raw.mp4

ffmpeg sadece ilk görüntünün boyutunu (556x494) alır ve sonra diğerlerini tam boyutuna dönüştürerek en boy oranını bozar.

Şimdi ImageMagick'e göre kırparak görüntüleri otomatik olarak hedef 480p en boy oranına dönüştürelim : bir görüntüyü belirli bir en boy oranına nasıl asgari düzeyde kırpacağız?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Şimdi, en boy oranı iyi, ancak kaçınılmaz olarak, görüntülerin ilginç kısımlarını kesen bir miktar kırpma yapılması gerekiyordu.

Diğer seçenek, şu şekilde gösterilen en boy oranına sahip olmak için siyah arka planla doldurmaktır: Bir kutuya sığacak şekilde yeniden boyutlandırın ve "boş" kısımda arka planı siyah olarak ayarlayın

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

Genel olarak konuşursak, ideal olarak aynı veya benzer en boy oranlarına sahip görüntüleri ilk etapta bu problemlerden kaçınmak için seçebilirsiniz.

CLI seçenekleri hakkında

Bununla birlikte, isme rağmen, -globbunun kabuk Glob desenleri kadar genel olmadığını unutmayın, örneğin: -i '*'başarısız: https://trac.ffmpeg.org/ticket/3620 (görünüşe göre filetype uzantıdan çıkarıldığı için).

-r 30-framerate 1videoyu düşük kare hızları için VLC gibi oyunculardaki hataların üstesinden gelmek için 30 FPS yapar : VLC, ffmpeg içeren görüntülerden oluşturulan düşük 1 FPS video için donar. Bu nedenle saniyede istenen 1 görüntüyü korumak için her kareyi 30 kez tekrarlar.

Sonraki adımlar

Ayrıca şunları yapmak isteyeceksiniz:

YAPILACAKLAR: ara dosyalar olmadan videoya birden fazla ses dosyasını kesmeyi ve birleştirmeyi öğrenin, bunun mümkün olduğuna eminim:

Üzerinde test edildi

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

kaynakça


Ffmpeg'i başlatmak için python ve subprocess.call kullanıyorsanız ', giriş ve çıkış dosya adlarında tek tırnak kullanmamalısınız . Aksi takdirde dosyaları bulamaz.
00'da RunOrVeith

Bu benim için harika olurdu, ancak npm paketinden yaptığım yapı ffmpeg-staticglob uygulamıyor. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi

-pix_fmtTrailing options were found on the commandline.hataya neden oldu
Anthony Kong

@AnthonyKong ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4Ubuntun 19.10 ffmpeg 4.1.4 ile şu an üreyemedim, sürümünüz ve tam komutunuz nedir?
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

20

Dokümanlar'dan Basit Sürüm

Google Earth Studio görüntüleri için özellikle harika çalışıyor :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
Bu çıkış oynatılamıyor: [h264 @ 0x7f148cc3cc40] donanım hızlandırıcı resmi çözemedi
Bram

merhaba ben sadece bana yardım edebilir misiniz bu buluyorum bu komutu nasıl çalıştırabilirim?
Masum

@ Terminaliniz veya Konsolunuzdan Masum.
Joshua Pinter

anladım ama proje% 3d.png tüm resimlerimi Project001.png, Project002.png adında bir klasörde seçmedi, sadece tüm resimleri almak ve videoya dönüştürmek için ne yapmalıyım
Masum

%3dVeya kullanıyor musunuz %03d?
Joshua Pinter

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.