Estrarre "uno di each 10 fotogrammi" in un video utilizzando VLC o FFmpeg

Sto cercando di estrarre "esattamente 1 fotogramma di each 10" fotogrammi di un video (es. Estratto 1, lasciare 9 poi ripetere) per scopi scientifici. Il video è di 105 fotogrammi, 3,5 secondi, 29,97 fps (h.264, .mov, prodotto da Nikon D3100).

L'ho caricato qui .

VLC

Il command sotto deve produrre 10 fotogrammi, ma produce solo 6 immagini. Ho provato diversi rapporti di scena e nessuno di loro produce un numero corretto di fotogrammi (nemless vicino a correggere).

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

Qualcuno ti prego di dirmi qual è il problema?

FFmpeg

FFmpeg non sembra avere un command esattamente per il mio scopo. Sotto il command estrae 3 frame di each secondo, ma poiché l'FPS non è esattamente 30 (piuttosto 2.97), che non produrrà risultati corretti per me.

Inoltre anche FFmpeg non dà il numero corretto di fotogrammi con questo command anche. Per 3,5 secondi di video mi aspetto al massimo 10 fotogrammi, ma quello che ottengo è 12 fotogrammi!

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

Come posso get quello che voglio?

Selezionare 1 fotogramma su each 10 fotogrammi

È ansible utilizzare il filter video select in ffmpeg per eseguire questa operazione:

 ffmpeg -i input -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg 
  • Per l'output JPG è ansible variare la qualità con -q:v . La gamma effettiva è 2 (migliore qualità) a 31 (qualità peggiore). Questa opzione non è necessaria se si desidera eseguire l'output a PNG.

  • Questo produrrà img_001.jpg , img_002.jpg , img_003.jpg , ecc.

L'aspetto più importnte della tua domanda è il fatto che il video utilizza 29,97 fotogrammi al secondo, non 30. NTSC pesky.

Comunque, penso che sarebbe più semplice estrarre each fotogramma e poi rimuovere quelli che non avete bisogno:

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

Quindi, rimuovi quelli che non avete bisogno. Poiché each decimo fotogramma finirà con un 1.jpg , possiamo prendere tutti gli altri …

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

… e una volta che sei sicuro che questi sono quelli che vuoi rimuovere:

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

Se è ansible utilizzare il mencoder , è ansible provare l'opzione framestep , come spiegato nella documentazione , come framestep=10 nel tuo caso. Personalmente non ho potuto installarlo / provarlo però.

Se si wheresse prima convertire il video in una serie di immagini rgb24 o rgb32 raw, forse potresti essere in grado di get il giusto numero di fotogrammi in quanto in forma originale sembra includere tipi di fotogrammi insoliti che potrebbero non essere immagini a tutti? ? Nei dischi laser originali, l'integer video era composto da una serie di immagini con singoli numbers di fotogrammi da 1 a 100.000 o più e questo è veramente il modo corretto di stabilire una linea di base per future conversioni o manipolazioni. L'industria è cambiata in questa strana idea di compressione semplicemente per ridurre i soldi in outlaid e per corrompere le forms scientifiche di gestione dei numbers. Devi prima estrarre qualsiasi audio come file wave in modo da non perdere completamente l'audio. Sembra FFMPEG mette l'identificazione di informazioni in each image estratta perché se si tenta di stringere le immagini insieme da quelle appena estratte e si mescola altre immagini da altre fonti con la stessa estensione, ffmpeg ignorerà le immagini che hai provato a mettere in mezzo a tutto. Con il formato del disco laser la frequenza di fotogramma è semplicemente dettata da qualsiasi velocità che presentate le immagini sequenziali e non controllate in alcun modo dalle immagini stesse. FFMPEG potrebbe prendere una lezione dalla scienza invece che l'arte per una corretta manipolazione e visualizzazione di immagini di qualsiasi tipo. O forse l'integer settore AV. L'industria ha veramente bisogno di migliorare le funzionalità dell'hardware e di utilizzare dati grezzi che richiedono molta memory / memory. Nulla batte i dati grezzi per la precisione e l'accuratezza.