PNG çerçevelerini 1 FPS'de videoya dönüştürme


21

Ben 1 FPS PNG formatında video çerçeveleri var ve ben ffmpeg kullanarak bir videoya dönüştürmek çalışıyorum.

Eğer böyle bir şey yaparsam:

ffmpeg -i data/input-%4d.png data/output.mp4

Temelde girişin çok hızlı ilerlemesi olan (1FPS'de yakalanan) 25FPS'de bir video alıyorum.

Eğer denersem:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

VLC'nin oynamak istemediği bir şey alıyorum :)

Şimdi, ilk videoyu (FF olanı) alıp yavaşlatmak için bir filtre uygularsam (örn. -filter:v 'setpts=24.0*PTS'), 1 FPS video gibi oynatabilirim, ancak elbette fiyat dosya boyutudur. Sanırım bir sürü tekrarlanan kare oluşturuyor.

Soru şu: Tam olarak 1 FPS'ye sahip olan ve aslında bu hızda oynayan bir videoyu nasıl oluşturabilirim? Çıktı biçimi, btw, benim için o kadar önemli değil.


ffmpegSadece kapsayıcı dosya uzantısı, video codec'i anlamaya yeterince akıllı olduğundan emin değilim .mp4. Kod -vcodec libx264 -vpre hqsatırını ve kodlama parametrelerini anlatmak için komut satırına eklemeyi deneyin .
Warren Young

Aslında bunu anladım ve bahsettiğim gibi iyi çalıştı ve eklediğimde sadece garip sonuçlar üretti -r 1.
Assaf Lavie

Ben stackoverflow.com veya superuser.com bir ffmpeg cevap daha iyi şans olabilir düşünüyorum .
Damien

Yanıtlar:


19

Saniyede 1 kare hızında oynatılan bir video oluşturan FFMPEG için tek astar istiyorsanız, yapmak istediğiniz şey hem giriş hem de çıktı için kare sayısını belirtmektir:

ffmpeg -r 1 -i veri / giriş-% 4d.png -pix_fmt yuv420p -r 10 veri / çıkış.mp4

-r 1Araçlar, video ve 1 de oynayacak orijinal görüntülerin saniyede. Araçlar, video, saniyede 10 kare oynayacak.
-r 10

( -pix_fmt yuv420pÇok çeşitli oynatma programlarıyla uyumluluğu sağlamak için oradadır. Burada, örneğin videonun Windows Media Player tarafından oynatılabilmesi için gereklidir.)

Birçok farklı çıkış karesini test ettim ve 10, hala VLC'nin oynatacağı bir video üretecek en düşük sayı gibi görünüyor.

Tabii ki, yukarıdaki komut her orijinal görüntünün çarpıldığı anlamına gelir, ancak bahsettiğiniz "yavaşla" dan daha basit bir yöntemdir ve codec bileşenine bağlı olarak gerçek bir 1-FPS'den çok daha büyük bir video üretmeyebilir video.

Bunu test etmek için, sadece 2.24 kiloya çıkan gerçek bir 1-FPS video ürettim. Daha sonra aynı giriş görüntülerine sahip ancak 24 FPS'de çıkış yapan bir video hazırladım ve 5.76 kiB'ye çıktı. Bu, boyutun iki katından fazla ve boyutun 24 katına yakın bir yerde değil. :)


-Pix_fmt'de +1. Kolay unutmak bazı insanlar WMP kullanmakta ısrar :-)
Smalltown2k

giriş sadece 1 iken neden çıkış formatının 10 fps olmasını istersiniz? Tam olarak aynı olan% 90 yedekli kareler oluşturmaz mı?
Herbert

@Herbert gereksiz kare oluşturur, böylece kare hızını 10'a kadar alabilirsiniz, bu da VLC'nin şikayet etmemesi için yapılır ve videoyu görsel olarak değiştirmez. Kodlayıcı, çerçevelerin aynı olduğunu görecek kadar akıllıdır, bu nedenle çok daha büyük bir dosyayla
sonuçlanmazsınız

@chiliNUT açık, tüm formatlar değil, çoğu aklı başında formatlar yapacak anahtar kare şey. Teşekkürler!
Herbert

5

Her ikisini de kullanın -framerateve-r

Örneğin, 1FPS'ye benzeyen bir son videoya sahip olmak için:

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

Bu, PNG çerçevelerini 1 FPS'de videoya dönüştürmeye benzer | Unix & Linux Stack Exchange diyor, ancak -frameratebunun yerine -rçalışmam gerekiyordu.

Wiki'de şu adresten bahsedilir: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

VLC'nin 30işleyebileceği çıkış çerçevesini ayarlar ve her görüntüyü 30 kez kopyalar, böylece çıkış videosu 1 FPS'de görünür. Ayrıca bkz: ffmpeg kullanan görüntülerden düşük fps video içeren VLC'de oynatma sorunları | Yığın Taşması

VLC daha sonra videoyu normal şekilde oynatabilir.

Ubuntu 16.10, VLC 2.2.4, ffmpeg3.0.5 üzerinde 10 PNG içeren bir dizinde test edilmiştir .

Ayrıca bkz: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


Arasındaki fark nedir -rve -framerate?
Mart'ta Royi

@Royi Gerçekten bilmiyorum, bunun dışında benim için çalışan tek şey :-) Ama mansayfalardan ayıklamayı başardıysanız , bana bildirin ;-) Anlamlı bir teklif "-r As girdi seçeneğinde, dosyada depolanan zaman damgalarını yok sayın ve bunun yerine sabit kare hızı fps varsayımıyla zaman damgaları oluşturun.Bu, image2 veya v4l2 gibi bazı girdi biçimleri için kullanılan -framerate seçeneğiyle aynı değildir (eski sürümlerinde de aynıydı) Şüpheniz varsa, -r giriş seçeneği yerine -framerate kullanın. "
Ciro Santilli 事件 at 中心 法轮功 六四

3

İkinci örneğinizi aşağıdaki gibi hafifçe artırırsanız:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

-r 1İhtiyaçlar .png dosyaları önce değil sonra gelmek üzere.

Gönderen FFmpeg belgelerinde :

Genel bir kural olarak, seçenekler bir sonraki belirtilen dosyaya uygulanır. Bu nedenle, sıra önemlidir ve aynı seçeneği komut satırında birden çok kez kullanabilirsiniz. Her olay daha sonra bir sonraki girdi veya çıktı dosyasına uygulanır.


Ne yazık ki bu işe yaramıyor. Ancak, siparişin önemli olduğunu belirtmek beni çok zaman kazandırdı. Teşekkürler.
Mohammed Noureldin

0

Bu, VLC'deki bir hatadır (3.0.6 sürümünde hala mevcuttur). Bazı deneylerden sonra VLC'nin 10'dan az FPS'li videolar için çöktüğünü fark ettim . Bu nedenle, 10 FPS veya daha fazla olan tüm videolar sorun olmamalıdır. Yani şu anda VLC'de oynatılabilen 1 FPS ile video almanın temiz bir yolu yok ( pes etmeyin, okumaya devam edin ).

Çözümlerden biri, görüntüleri çoğaltarak 1 FPS'nin etkisini taklit etmek için yukarıdaki cevapta gösterildiği gibi (aslında bir FPS 10 veya daha fazlasına eşit olduğunda, VLC için uygundur).

Örnek: 12 görüntü içeren bir klasörünüz varsa ve 1 FPS (VLC'de oynatılabilir) içeren bir video oluşturmak istiyorsanız, her görüntüyü birkaç kez çoğaltmanız gerekir (diyelim ki 10 kez) ve sonra FFMPEG'e söyle 10 FPS video oluşturmak için. Bu şekilde, her görüntünün 1 saniye boyunca oynatılacağı (10 kez çoğaltıldığı gibi) toplam 120 kare içeren bir video elde edeceğiz, bu da 1 FPS için sahte.

Bazı durumlarda sorun yaratabilecek ( resmi belgelere göre) parametre yerine (başka bir cevapta gösterilen) kullanmayıfps-r tercih ederim .

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

Giriş -framerateçıkıştan daha düşük olduğundan fps, FFMPEG istediğiniz çıkış kare hızına (yukarıdaki komuta göre 10 olan) ulaşmak için kareleri çoğaltır.

Ayrıca bir bildirime önemli olduğunu sırası -framerateve -vf fpsönemlidir bu yapılandırma (in- veya çıkış) sonraki bahsedilen videoya uygulanacak olarak. Göredir Yani resmi dokümanlar :

seçenekler bir sonraki belirtilen dosyaya uygulanır. Bu nedenle düzen önemlidir ...

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.