FFmpeg może przechwytywać obrazy z filmów, które można wykorzystać jako miniatury do reprezentowania filmu. Najczęstsze sposoby wykonania tego są przechwycone na Wiki FFmpeg .
Ale nie chcę wybierać losowych klatek w niektórych odstępach czasu. Znalazłem kilka opcji za pomocą filtrów na FFmpeg do przechwytywania zmian sceny:
Filtr thumbnail
próbuje znaleźć najbardziej reprezentatywne klatki w filmie:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
a następujące polecenie wybiera tylko ramki, które mają więcej niż 40% zmian w porównaniu z poprzednimi (a więc prawdopodobnie są to zmiany scen) i generuje sekwencję 5 PNG.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Informacje kredytowe za powyższe polecenia dla Fabio Sonnati . Drugi wydawał się lepszy, ponieważ mogłem uzyskać n zdjęć i wybrać najlepszy. Próbowałem i wygenerowałem ten sam obraz 5 razy.
Dalsze dochodzenie doprowadziło mnie do:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
zapewnia, że otrzymujesz różne obrazy. To wciąż zawsze wybiera pierwszą klatkę filmu, w większości przypadków pierwsza klatka jest napisami / logo i nie ma znaczenia, więc dodałem -ss
3, aby odrzucić pierwsze 3 sekundy filmu.
Moje ostatnie polecenie wygląda następująco:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
To było najlepsze, co mogłem zrobić. Zauważyłem, że ponieważ wybrałem tylko 5 filmów, wszystkie pochodzą głównie z początku filmu i mogą przegapić ważne sceny, które pojawią się później w filmie
Chciałbym wybrać twoje mózgi, aby znaleźć inne lepsze opcje.
mjpeg
kodera dla mnie, a także sprawdziłem jpegoptim
i exiv2
oba działają dobrze dla mnie ze wszystkimi wynikami JPG z twoich przykładowych poleceń.
libopenjpeg
... nie jestem pewien, czy to robi różnicę.