Videoyu görüntüye nasıl dönüştürebilirim?


69

Bir video dosyasını bir resim dizisine, örneğin her N saniyede bir kare olarak nasıl dönüştürebilirim. Mplayer veya ffmpeg bunu yapabilir mi? MPlayer'ı ekran görüntülerini manuel olarak yakalamak için kullandım ancak bunu uzun bir video için otomatikleştirmek istiyorum.


Görüntü kalitesini seçmekle ilgili şu soruya göz
Pierz

Yanıtlar:


68

Ffmpeg ile çok basit ve her komut dosyası eklemeden her N saniyede bir kare çıkarabilir . Bir görüntü dizisi olarak dışa aktarmak için çıktı olarak yalnızca kullanın veya kullanın . Bit sıfır dolgulu tamsayı dönüştürülür uzun basamağı - verdiğim örnek myimage_0000.png myimage_0001.png vb çıkışını alır .. Sen bir sürü kullanabilirsiniz hareketsiz görüntü formatları (bkz neyse, png, jpeg, tga, tam için liste).myimage_%04d.png%0xdxffmpeg -formats

Tamam, bir resim dizisi olarak dışa aktarmak için, sıralı bir dosya adına sahip çıktı olarak bir resim formatı kullanabiliriz, ancak her kareyi dışa aktarmak istemiyoruz. Bu nedenle , saniyedeki kare sayısının -r nolduğu seçeneği kullanarak çıktının kare hızını istediğimiz şekilde değiştirin n. Saniyede 1 kare -r 1, her dört saniyede -r 0.25bir kare, her on saniyede bir kare -r 0.1vb. Olacaktır.

Hepsini bir araya getirmek için, her dört saniyede bir input.mov çerçevesini kaydederek göründüğü gibi görünüyor: output_0000.png, output_0001.png vb.

ffmpeg -i input.mov -r 0.25 output_%04d.png

% Xd değerini, istediğiniz sayıda basamakla değiştirin; örneğin, komut 10.000'den fazla kare oluşturacaksa, %04dolarak değiştirin %05d. Bu aynı zamanda görüntü sırası olan giriş dosyaları için de geçerlidir. Daha fazlasını buradan okuyun .

Windows kullanıcıları: Komut satırında kullanım %

örnek: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

CMD ve BAT Scriptlerinde kullanım %%

örnek: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Komut satırlarında yalnızca birini %kullanmayın %%ve komut satırında kullanmayın . Her iki durum da bir hata üretecektir.


Her kareyi -rdışa aktarmak istersem ne yapmalıyım ? Videonun FPS'sini bilirsem, sanırım bunu girdim, ama ya yapmazsam?
Tomáš Zato

4
-R bayrağını hiç kullanma. Ardından FFMPEG giriş dosyasının kare hızını kullanır.
stib

2
Eğer unutmayın gerçekten kullanmak istiyorum jpegsEmin değilseniz, bu için png'ler ne istediğinizi bulunmaktadır. Benim durumumda, jpegher biri yaklaşık 50 kb'ydi ve pngyaklaşık 2 MB'dı.
mlissner

4
pngs'in avantajı kayıpsız sıkıştırmadır, bu nedenle görüntü sırasını ara olarak kullanıyorsanız ve fazladan boyutu dikkate almıyorsanız, o zaman png kullanabileceğiniz zamandır.
stib


27
mplayer -vo jpeg -sstep 5 file.avi

Her 5 saniyede bir kareyi jpeg dosyası olarak kaydeder.

Ancak, dosyanın sonunda durmayacak, son karenin kopyalarını üretmeye devam edecektir. Bunu önlemek için videonun süresini saniyeler içinde, başka bir oynatıcı kullanarak veya mplayer ile bulun:

mplayer -vo null -ao null -frames 0 -identify file.avi

ve "ID_LENGTH = 147.00" gibi bir satır arayın.

Uzunluktan 2 çıkarın ve bu değeri -endposseçenek için kullanın. Örneğin, 147 saniyelik bir video için:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

Bu bir mplayer böcek gibi geliyor. güzel geçici çözüm.
quack quixote

En azından bu komutu hangi işletim sisteminde kullandığınızı söyleyebilir misiniz?
Tomáš Zato

5 yıl önceydi, ama muhtemelen Ubuntu 10.4'teki en son Ubuntu Masaüstü idi.
Liam,

1 saniyeden kısa adımları nasıl seçebilirim? Sadece tamsayıları kabul ediyor.
fcpenha

Günümüzde, Debian'da mpv 0.27.0 kullanarak mpv --vo=image --sstep=5 movie.mkvyukarıda bahsedilen hata olmadan ( mpv , mplayer'ın bir çatalı) harika çalışıyor.
Adam Katz

11

İle ffmpeg, aşağıdakileri yapabilirsiniz:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Bu komut videonun 4. saniyesinde 320 × 240 boyutunda JPG küçük resim oluşturur. Bunu, zaman ve dosya adını değiştiren bir komut dosyasına koyun ve bitirdiniz.

Daha fazla bilgi: Videonun her X saniyesinde bir küçük resim görüntüsü oluşturun


Bu istediğimi yapmak gibi görünüyor, ama bir sorunla. Her yinelemede dosyayı en baştan işler, katlanarak yavaşlar.
Liam,

@Liam - Ofset zamanını yalnız bırakırsanız (1 olarak ayarlayın) ve -ss positionbunun yerine dosyayı daha fazla araştırmak için bayrağı kullanın mı? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
Nifle

1
@liam: öncekini koy, böylece arama, giriş videosunun kodu çözülmeden -ssönce -iolur. bu hızlandırmalı. Kaynak
vak quixote

2
Ffmpeg ile yapmanın daha iyi, daha hızlı bir yolu var. Aşağıdaki cevaba bakınız.
stib

stib'in çözümü en iyi IMO.
Griffin

8

Bir tür iletişim sayfasının peşindeyseniz ve Unix benzeri bir işletim sistemiyle çalışıyorsanız, Video Contact Sheet * NIX , short vcs .

Arka planda da kullanır ffmpeg(varsayılan olarak) veya mplayerdolayısıyla birçok video formatını da kullanabilir. Filmden hareketsiz görüntüleri yakalama işlemini otomatik hale getirir ve bunları bir başlık ve alt bilgi içeren bir görüntüye oluşturur. Örneğin kaç tane yakalama istediğinizi veya alternatif olarak aralarındaki zaman farkını seçebilirsiniz.

10 dakikalık bir süre için, çağrı şöyledir:

vcs -i 10m input.avi

Diğer bazı tweaks'ler için komut satırı seçeneklerinin tam listesini kontrol edin .

Ana sayfadan alınan örnek bir iletişim sayfası :

görüntü tanımını buraya girin


7

VLC 1.1.0 ve üzeri sürümlerle sahne video filtresini kullanabilirsiniz:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

Yukarıdakiler, her 00 kareden 1'ini (- sahne oranı = 24), 00:00: 10'dan başlayarak ve 00: 00: 11'de sona erdirir.

Yeni bir Windows 8 kurulumunda VLC 2.0.3 ile çalıştığını test ettim ve onayladım (ek video eklentim veya yazılımım yok).

Tüm belgeler: http://wiki.videolan.org/How_to_create_thumbnails


2

VirtualDub bunu sizin için yapabilir

File-> Export->Image sequence

görüntü tanımını buraya girin


Bu her kareyi resim olarak kaydedecek mi?
Liam,

evet, her kare.
Shevek

Çoğu kareyi atlamam gerekiyor, tüm karelerin çıktısı çok fazla depolama alanı kullanıyor. Birkaç saniyede bir kareye ihtiyacım var.
Liam,

1

Bunu da deneyebilirsin

VLC komut satırından ...

vlc "C: \ YOUR \ dosya \ yol \ dosya.avi" -V görüntüsü - görüntü çıkışı-öneki = başlık adı - görüntü çıkışı-oranı = 60

file.avi, yakalamak istediğiniz videodur, capname kaydedilen resimlerin ön ekidir, oranla oynamak isteyebilirsiniz (60, 60 resimden 1'inin yakalandığı anlamına gelir) örneğin daha fazla komut ekleyebilirsiniz. - imge-out-format jpeg, kapaklarınızı pngs yerine jpeg olarak kaydeder, --snapshot-path, kapaklarınızı nereye kaydedeceğinizi seçmenize izin verir.

Yukarıdakilerin kaynağı


Bu mesajı aldım: Komut satırı seçenekleri yüklenemedi, geçerli olduklarını kontrol edin.
Liam,

Ubuntu'da şu mesajı aldım: bilinmeyen seçenek veya eksik zorunlu argüman `--image-out-prefix = capname '
Liam

1

VirtualDub'da kareleri atlayabilirsiniz. Sadece Video -> Kare Hızı menüsünde bulunan "Kime Göre Al" seçeneğini kullanın. Örneğin, "100'e Kadar Düşür" seçeneğini belirlerseniz, Dosya -> Dışa Aktar -> Görüntü sırasını kullanırsanız, yalnızca her 100. karede bir tasarruf sağlar.

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.