VLC veya FFmpeg kullanarak bir videoda “her 10 çerçeveden birini” çıkartma


12

Bilimsel amaçlar için bir videonun "her 10 tam olarak 1 kare" (yani özü 1, 9 bırakın ve tekrar) kare ayıklamak için çalışıyorum. Video 105 kare, 3,5 saniye, 29,97 fps'dir (h.264, .mov, Nikon D3100 tarafından üretilmiştir).

Buraya yükledim .

VLC

Aşağıdaki komut 10 kare üretmelidir, ancak yalnızca 6 görüntü üretir. Farklı sahne oranlarını denedim ve ikisi de doğru sayıda kare üretmedi (düzeltmeye bile yakın değil).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Birisi bana sorunun ne olduğunu söyler mi?

FFmpeg

FFmpeg'in amacım için bir komutu yok gibi görünüyor. Komutun altında her saniyeden 3 kare çıkar, ancak FPS tam olarak 30 olmadığından (2.97 değil), bu benim için doğru sonuçlar üretmeyecek.

Ayrıca FFmpeg bile bu komutla doğru sayıda çerçeve vermez. 3,5 saniyelik video için en fazla 10 kare bekliyorum, ancak elde ettiğim 12 kare!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

İstediğimi nasıl başarabilirim?


1
BTW -sameqmuhtemelen düşündüğünü yapmaz ve mevcut sürümden kaldırılmıştır (gerçek ffmpeg, Ubuntu sahte ffmpeg'de olup olmadığından emin değilim). Bunun yerine qscale kullanın.
stib

Yanıtlar:


21

Her 10 çerçeveden bir kare seçin

Bunu yapmak için selectvideo filtresini kullanabilirsiniz ffmpeg:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • JPG çıktısı için kaliteyi ile değiştirebilirsiniz -q:v. Etkili aralık 2 (en iyi kalite) ile 31 (en kötü kalite) arasındadır. Bunun yerine PNG'ye çıktı almak istiyorsanız bu seçeneğe ihtiyacınız yoktur.

  • Çıktısı verir img_001.jpg, img_002.jpg, img_003.jpgvb


Çok ilginç görünüyor, ancak belirli bir sürüm veya ekstra derlenmiş bir şey gerektiriyor gibi görünüyor. " unrecognized option '-filter:v'" İle "FFmpeg SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk

Komutu da çalıştıramıyorum ve ffmpeg pencereleri N-35709-g7d531e8'de şu hatayı alamıyorum: [@ 017EBB00'ü seçin] [Eval @ 0022DC08] Eksik ')' veya 'mod (n \, 10))' [ select @ 017EBB00] 'not (mod (n \, 10)) ifadesi ayrıştırılırken hata oluştu' mod (n \, 10)) 'filtresini başlatırken hata' select 'argümanlarla' değil (mod (n \, 10)) 'Filtreleri açarken hata!
wmac

@mivk Ubuntu deposundaki FFmpeg sürümünüzde filtreleme özelliği yok. FFmpeg'i derlemeniz gerekecek .
llogan

1
@wmac Sanırım Windows tek tırnakları sevmiyor. Çift tırnak onları değiştirin: ".
llogan

1
@ LordNeckbeard, teşekkürler, doğru çalışır ve tüm sorunu çözdü. Yardımın için gerçekten minnettarım.
wmac

4

Sorunuzdaki en önemli husus, videonun 30 yerine saniyede 29,97 kare kullanmasıdır. Pesky NTSC.

Her neyse, bence her kareyi çıkartmanın ve ihtiyacınız olmayanları kaldırmanın en kolay yolu olacağını düşünüyorum :

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Ardından, ihtiyacınız olmayanları kaldırın. Her onuncu çerçeve bir ile biteceğinden 1.jpg, diğerlerini alabiliriz…

find . -maxdepth 1 -not -iname "*1.jpg"

… Ve bunları kaldırmak istediğinizden emin olduktan sonra:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Kullanabiliyorsanız mencoder, framestepdavanızda olduğu gibi dokümanlarda açıklandığı gibi seçeneği deneyebilirsiniz framestep=10. Ben şahsen olsa yüklemek / denemek olamazdı.


1
Yardımınız ve düzenlemeniz için çok teşekkür ederim. Mencoder'ı denedim ve hatta bir problemi var! Kodek veya kapsayıcı ile ilgili bir şey var sanırım. ffmpeg aşağıdaki komutla tam 105 kareyi ayıklar: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg ama mencoder sadece 90 kareyi ayıklar !!! Aşağıdaki komutla: mplayer -vo png 1.mov framestep = 10 kullanılması yanlış sayıda kare üretir. Üçünün de (ffmpeg, vlc ve mencoder) böyle basit bir görevi doğru bir şekilde yapamadığı konusunda şok oldum. VLC web sitesine bir hata raporu gönderdim. Tekrar teşekkürler.
wmac

0

İlk önce videoyu bir dizi ham rgb24 veya rgb32 görüntüsüne dönüştürecek olsaydınız, orijinal formda hiç görüntü olmayabilecek sıra dışı çerçeve türlerini içerdiği için doğru sayıda kare elde edebilirsiniz? ?

Orijinal Lazer Disklerde, videonun tamamı 1 ila 100.000 veya daha fazla kare sayısına sahip bir dizi görüntüden oluşuyordu ve bu, gelecekteki dönüşümler veya manipülasyonlar için bir temel oluşturmak için gerçekten doğru yoldur.

Sanayi, yalnızca paraları azaltmak ve sayıları işlemek için gerçek bilimsel biçimleri bozmak için bu garip sıkıştırma fikrine dönüştü.

Sesi tamamen kaybetmemek için önce herhangi bir sesi dalga dosyası olarak çıkarmalısınız. Görünüşe göre FFMPEG, çıkarılan her görüntüye tanımlayıcı bilgi koyar, çünkü görüntüleri çıkartılanlardan bir araya getirmeye çalışırsanız ve aynı uzantıya sahip diğer kaynaklardan diğer görüntüleri karıştırırsanız, ffmpeg, her şeyin ortasına yerleştirmeye çalıştığınız görüntüleri yoksayar .

Lazer disk formatıyla, kare hızı sıralı görüntüleri sunduğunuz hıza göre belirlenir ve görüntülerin kendileri tarafından hiçbir şekilde kontrol edilmez.

FFMPEG, her türlü görüntünün uygun şekilde işlenmesi ve gösterilmesi için sanat yerine bilimden bir ders alabilir. Ya da muhtemelen tüm AV endüstrisinin kendisi. Endüstrinin gerçekten donanım yeteneklerini geliştirmesi ve çok fazla bellek / depolama gerektiren ham veriler kullanması gerekiyor. Kesinlik ve doğruluk için hiçbir şey ham verileri yenemez.

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.