FFmpeg può catturare immagini da video che possono essere utilizzate come miniature per rappresentare il video. I modi più comuni per farlo sono catturati nel Wiki di FFmpeg .
Ma non voglio scegliere fotogrammi casuali ad alcuni intervalli. Ho trovato alcune opzioni usando i filtri su FFmpeg per catturare i cambiamenti di scena:
Il filtro thumbnail
cerca di trovare i frame più rappresentativi nel video:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
e il seguente comando seleziona solo i fotogrammi che hanno più del 40% di cambiamenti rispetto ai precedenti (e quindi probabilmente sono cambiamenti di scena) e genera una sequenza di 5 PNG.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Credito informativo per i comandi di cui sopra a Fabio Sonnati . Il secondo mi è sembrato migliore in quanto ho potuto ottenere n immagini e scegliere il meglio. L'ho provato e ha generato la stessa immagine 5 volte.
Qualche ulteriore indagine mi ha portato a:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
ti assicura di ottenere immagini diverse. Questo seleziona sempre il primo fotogramma del video, nella maggior parte dei casi il primo fotogramma è crediti / logo e non è significativo, quindi ho aggiunto un -ss
3 per scartare i primi 3 secondi del video.
Il mio comando finale è simile al seguente:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Questo è stato il massimo che ho potuto fare. Ho notato che dal momento che scelgo solo 5 video, sono tutti per lo più dall'inizio del video e potrebbero perdere importanti scene che si verificano più avanti nel video
Vorrei scegliere il tuo cervello per qualsiasi altra opzione migliore.
mjpeg
encoder per me, e ho anche controllato jpegoptim
e exiv2
, entrambi i quali funzionano bene per me con tutti i risultati JPG dai tuoi comandi di esempio.
libopenjpeg
.. non sono sicuro se questo fa la differenza.