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


86

ffmpegSayının sıfırdan başlayamadığı bir dizi diziden video oluşturmak mümkün mü ?

Örneğin, bazı resimlerim var [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg] ve onları bir videoya dönüştürmek istiyorum. Aşağıdaki komutu denedim, ancak işe yaramadı (sayının sıfırdan başlaması gerekiyor gibi görünüyor):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

Herhangi bir tavsiye?


Bunu sorduğunuzdan bu yana bir süre geçti, ama hala soru ile ilgileniyorsanız, cevabım EVET - Aşağıda detayları ve bir örneği gönderdim: stackoverflow.com/a/12160155/181638
Esad Ebrahim

@ casperOne, bunun neden konu dışı olduğu hakkında bir fikriniz olması için faydalı olacaktır. Belirli bir programlama sorunu gibi görünüyor. FFmpeg etiketi 3.7k takipçileri vardır ve ile 27k görüşlerini açıkça bulmasına yararlı ..
geotheory

2
@geotheory Etiket istatistikleri alakasız. ffmpeg bir olan programı WinRar, diyelim yolunda çok. Eğer karşı programlamak mümkün olmakla birlikte kütüphanelerin içinde ffmpeg , bu soru o değil. Komut satırından ffmpeg kullanmak , konunun bulunduğu Süper Kullanıcı'da sorulacaktır .
casperOne

Yanıtlar:


81

-start_numberDüğmeyi böyle kullanıyorsanız dosyaları yeniden adlandırmaya gerek yoktur :

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

burada nhareketsiz resimler dizisinin başlangıcıdır.

Not, bu başladığında sıra kesilmemiş olduğu sürece çalışacaktır. Boşluklar varsa ve tüm fotoğrafların dahil edilmesini istiyorsanız, boşlukları doldurmak için yeniden numaralandırma gerekebilir.

Yararlı bulabileceğiniz başka anahtarlar da var.

Daha yavaş bir kare hızı elde etmek, görüntüleri sıkıştırmak ve daha küçük bir sonuç elde etmek için aşağıdaki tek astarı kullanıyorum:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3Ben kısa bir süre için hala her görebileceği şekilde opsiyon saniyede 3 kare elde edilen videonun frame ayarlar. -sOpsiyon çıkan video boyutunu yönetmek için istenen çözünürlüğe fotoğraf yeniden ölçeklendirilir.

(Windows kabuğunda, -i Imgp%04d.jpgbununla değiştirin -i "Imgp%%04d.jpg". Bunun için Mike Fitzpatrick'e kredi https://superuser.com/a/344178/153054 )


4
-r ve -framerate arasındaki fark nedir?

1
aynı IIRC
rogerdpack

22
'Ls' de göründüğü sırayı kabul etmekten memnuniyet duyduğunuz sürece saçmalamaya gerek yoktur ... sadece kullanın: ffmpeg -pattern_type glob -i '* .jpg' movie.mp4
Orwellophile

2
Görüntüler arasındaki zaman boşluğunu kontrol etmek için herhangi bir anahtar var mı , örneğin, ilk görüntü 13s, ikinci 15s, üçüncü için 24s göstermek istiyorum, zaman boşluğu kullanıcı tanımlı, bu mümkün mü?
zionpi


38

Bunu aşağıdaki kod parçacığını kullanabilirsiniz:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

Bu, JPG’leri meta verilerde belirtilen dönüşlere döndürmez.
Erik Johansson

17

Örnek bir betiği ffmpeg belgelerinde bulabilirsiniz :

3.2 Tek fotoğrafları nasıl film halinde kodlarım?

Yeniden adlandırılacak çok sayıda resim varsa, yükü hafifletmek için aşağıdaki komutu kullanabilirsiniz. Bourne kabuğu sözdizimini kullanan komut, geçerli dizindeki * jpg ile eşleşen tüm dosyaları /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg' vb.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

O zaman koş:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

2
Görüntüyü başlatmak için x = 0 yapmak daha iyi olur, böylece ffmpeg beklediği gibi img000.jpg imge adı başlar. Ayrıca, ffmpeg dosyaları bulamadığı için işaretleme benim için işe yaramadı, bu yüzden bunun yerine cp kullanmak zorunda kaldım (bariz hız ve alan geri çekildi ama yine de onları rm). Orijinalleri kaybetmek sakıncası yoksa mv da işe yarar.

Bu cevapta verilen komutun sembolik linkler değil sabit linkler oluşturduğunu unutmayın. Bağlamanın cpişe yarayıp yaramadığının kullanımıyla ilgili olarak, dosya sisteminiz destekliyorsa cp --reflink=auto, çok daha iyi hız / alan kullanımı elde edersiniz .
Félix Saparelli

12

Gönderen ffmpeg dokümanlarının:

Glob kalıbı kullanma

ffmpeg, bash tarzı globbing'i de destekler (*, herhangi bir karakterin herhangi bir sayısını temsil eder).

Görüntülerin sıralı olması durumunda, ancak önceki örneklerde olduğu gibi sayısal olarak sıralı olarak olması gerekmediğinde bu kullanışlıdır.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Bu nedenle, dosyalarınız sıralandığı sürece, -pattern_type globanahtarın kullanılması sizin için çalışmalıdır.


Bu kürenin normal kabuk kürelerden daha sınırlı olduğuna dikkat edin: görünüşte trac.ffmpeg.org/ticket/3620 çünkü resim türü uzantıdan düşülüyor .
Ciro Santilli

11

Bildiğim kadarıyla, diziyi rastgele sayılarla başlatamazsınız (0 veya 1'de başlatmanız gerekip gerekmediğini hatırlamıyorum), artı, eğer boşluk varsa, ffmpeg dizinin bittiğini ve daha fazla resim eklemeyi bırakın.

Ayrıca, cevabımdaki yorumlarda belirtildiği gibi, indeksinizin genişliğini belirtmeniz gerektiğini de unutmayın. Sevmek:

Resim% 03d.jpg

% 03d dizin türünü kullanıyorsanız, dosya adlarınızı 0 ile doldurmanız gerekir:

image001.jpg image002.jpg image003.jpg Kullanıcısı

vb.


1
Eğer görüntü dosyası isimleri baştaki sıfırlara sahipse, format dizgisi "% 03d" gibi bir genişlik de belirtmelidir.

1
Tek engel buysa, resimlerinizi yeniden adlandırmak veya düzgün bir şekilde yeniden dizilmiş kümeye yeniden bağlamak için sadece bir komut dosyası yazabilirsiniz.
Cascabel

1
Evet, daha önce bununla çalıştım, bir süre önce Ruby'de bir sarmalayıcı yazmıştım, burada example.addImage (), sonra example.processVideo () olarak adlandırdınız ve zamansal bir dizin oluşturup görüntüleri uygun indekslerle yeniden adlandırın ve videoyu oluşturun. Bu oldukça kolaydır.

@Jefromi Bir sembolik link oluşturdum ama sembolik link dosyasını ffmpeg'e nasıl vereceğim? Sadece bağlantı linki dosyasının dönüştürmeye çalıştığım resim olduğunu varsayar. Ben Win7 btw üzerinde

Dizi, 0 ila 4 arasında yer alan herhangi bir yerden başlayabilir.
Esad Ebrahim

5

Francisco ile aynı fikirdeyim, ancak geçici bir çözüm olarak, ffmpeg'in ihtiyaç duyduğu sıra numaralarına sahip dosyalara sembolik bağlantılar oluşturmak veya oluşturmak için hızlı bir komut dosyası yazabilirsiniz. Betik daha sonra ffmpeg'i çağırabilir ve sonra bağlantıları kaldırabilir veya dosyaları tekrar orijinal konumlarına taşıyabilir.


1

yukarı Bak

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

Bunun eski bir soru olduğunu biliyorum ama aynı cevabı ararken Google’da da karşılaştım. Buradaki cevapların hiçbiri beni tamamen tatmin etmedi bu yüzden daha fazla araştırma ve okuma yaptım ve bu benim kendi sorunum için bulduğum bir komut.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Böyle bir komutu kullanmamın nedeni ...

  1. Cat and -f image2pipe, kullandığınız görüntüleri kontrol etmenizi sağlar. Örneğin, sonuçları genişletmeniz için parantez genişletme ve grep gibi diğer komutların bash özelliklerini kullanmanıza izin verir.
  2. Hatırlamak için daha az anahtar.
  3. -R kullanmama önerilir ve bunun yerine sadece -framerate kullanın. Benim deneyimlerime göre -r, kareleri daha sık düşürme eğilimindedir.
  4. Daha az karmaşık, gereksiz anahtar kullanılmaz ve olduğu gibi çalışır. İhtiyaçlarınıza göre daha fazla karmaşıklık (örneğin, kodlayıcı belirtme) ekleyebilir ve ince ayar yapabilirsiniz.

OP'nin sorusu için -start_numbergereken tek şey bu.
Gyan

0

Videom bir flash player'a (Jwplayer) girdiğinden beri flv kodlayıcısını kullandım.

ffmpeg -i% d.jpg -vcodec flv test.flv


0

Gönderen belgeler , basitçe kullanabilirsiniz görünüyor *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Bir not olarak, kaliteyi etkilemek için, hız / fps önemli olabilir (örneğin, çok düşük / yüksek kare hızını belirlemek ve ardından yavaş hareket videosunu normale döndürecek ikinci bir filtreden geçmek?)


0

Benim durumumda, dosyalardaki sayılar yüzünden biraz daha zordu. Resimlerim şöyle gözüküyor:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

ve işte kullandığım komut:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

Bunu ile yapabilirsiniz convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

Kullanmak istersen ffmpeg, kullandım

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

nerede 10*PTSffmpeg söyler 10 kez yavaşlatmak için. Ayrıca hızlandırmak için orada kesirler de olabilir.


Bu sadece orijinal görüntü dizinizi yeni bir alana enterpolasyondur, sorulan OP gibi bir video dosyası oluşturmaz.
f0ster

0

-pattern_type glob sesli somut örnekler

Bu seçenek şu adreste belirtilmiştir: https://superuser.com/a/782520/128124, ancak burada videoya ses eklemek de dahil olmak üzere kullanımına dair birkaç somut örnek bulunmaktadır.

Saniyede bir görüntü içeren slayt gösterisi videosu

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

Buna biraz müzik ekleyin, görüntüler sona erdiğinde ses kesildiğinde:

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:

Bir hippi olun ve Theora patentsiz numaralandırılmış 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 sırayla alfabetik olarak sıralanmalıdır:

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

ve bunun gibi.

Ayrıca bakınız: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Her kare için bir görüntü ile 30 FPS'de normal hızda video

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

İşte göründüğü gibi:

GIF ile oluşturulan: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Buna biraz ses ekle:

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

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

Yanıtlandığı yer: MP3’ü Youtube’nun izin verdiği video

Bazı sentetik test girişi görüntüleri elde edin

Bunlar, bu cevapta kullandığım test görüntüleri:

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

İle oluşturulan görüntüler: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Özel algoritmalar ile 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 bir şey:

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

CLI seçenekleri hakkında

Ancak, ismine rağmen, -globbunun kabuk Glob patters 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ılıyor).

-r 30-framerate 1Videoyu 30 FPS'yi düşük kare hızları için VLC gibi oyuncuların hatalarının üstesinden gelmesi için yapar : https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using- ffmpeg / 41797724 # 41797724 Bu nedenle, saniye başına istenen 1 görüntüyü tutmak için her kareyi 30 kez tekrarlar.

Sonraki adımlar

Ayrıca isteyeceksiniz:

TODO: Birden fazla ses dosyasını videonun içine komut satırından kesip birleştirmeyi öğrenin:

Üzerinde test edildi

ffmpeg 3.4.4, sürüm 3.0.3, Ubuntu 18.04.

Kaynakça

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.