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.
źródło
libopenjpeg
... nie jestem pewien, czy to robi różnicę.mjpeg
kodera dla mnie, a także sprawdziłemjpegoptim
iexiv2
oba działają dobrze dla mnie ze wszystkimi wynikami JPG z twoich przykładowych poleceń.Odpowiedzi:
Co powiesz na poszukiwanie pierwszej klatki o wartości> 40% w każdym z 5 przedziałów czasowych, gdzie przedziały czasowe to 1., 2., 3., 4. i 5. 20% filmu.
Możesz także podzielić go na 6 przedziałów czasowych i zignorować pierwszy, aby uniknąć kredytów.
W praktyce oznaczałoby to ustawienie niskiej liczby klatek na sekundę podczas sprawdzania zmiany sceny i argumentu, aby wyrzucić pierwszy fragment filmu.
...coś jak:
źródło
Unable to find a suitable output format for 'fps=fps=1/600'
. Rozwiązaniem jest dodanie-vf
przed tym argumentem (patrz stackoverflow.com/questions/28519403/ffmpeg-command-issue )Zdefiniowanie znaczącego jest trudne, ale jeśli chcesz sprawnie tworzyć N miniaturek obejmujących cały plik wideo, tego właśnie używam do generowania miniatur na produkcji z treściami przesłanymi przez użytkowników.
Pseudo kod
Gdzie:
ffmpeg -i <movie>
sam lub zffprobe
ładnym edytorem wyjściowym JSON btwPo prostu powyższe zapisuje środkową klatkę kluczową każdej partycji filmu. Np. Jeśli film ma 300s długości i chcesz 3 miniatury, to zajmuje jedną klatkę kluczową po 50s, 150s i 250s. Dla 5 miniatur będzie to 30, 90, 150, 210, 270. Możesz ustawić N w zależności od czasu trwania filmu D, np. 5-minutowy film będzie miał 3 miniatury, ale ponad 1 godzina będzie miał 20 miniaturek.
Występ
Każde wywołanie powyższego
ffmpeg
polecenia zajmuje ułamek sekundy (!) Dla ~ 1 GB H.264. Jest tak, ponieważ natychmiast przeskakuje na<time>
pozycję (-ss
wcześniej-i
) i przyjmuje pierwszą klatkę kluczową, która jest praktycznie kompletnym JPEG. Nie trzeba tracić czasu na renderowanie filmu w celu dopasowania do dokładnej pozycji czasowej.Przetwarzanie końcowe
Możesz mieszać powyżej z
scale
dowolną inną metodą zmiany rozmiaru. Możesz także usunąć ramki w jednolitym kolorze lub spróbować połączyć je z innymi filtrami, takimi jakthumbnail
.źródło
-ss N
do poprzedniej-i
jest niesamowitą wskazówką. Dziękuję Ci!Kiedyś zrobiłem coś podobnego, ale wyeksportowałem wszystkie klatki wideo (w 1 fps) i porównałem je z narzędziem perla, które znalazłem, które oblicza różnicę między obrazami. Porównałem każdą klatkę z poprzednimi miniaturami, a jeśli różniła się od wszystkich miniatur, dodałem ją do kolekcji miniatur. Zaletą jest to, że jeśli wideo przesunie się ze sceny A do B i powróci do A, ffmpeg wyeksportuje 2 klatki A.
źródło
Spróbuj tego
Za pomocą tego polecenia jestem w stanie wygenerować wymaganą liczbę miniatur, które są reprezentatywne dla całego wideo.
źródło
fps
byłaby poprawna formuła(no_of_frames_req * fps_of_vid) / total_video_frames
?Oto, co robię, aby wygenerować okresową miniaturę dla strumieni na żywo m3u8 do wykorzystania jako plakat. Znalazłem ciągłe zadanie ffmpeg tylko w celu wygenerowania miniaturek zjada cały mój procesor, więc zamiast tego uruchamiam cronjob co 60 sekund, który generuje wszystkie miniatury dla moich strumieni.
Jeśli potrzebujesz robić to częściej niż 60 sekund (ograniczenie cronjob), możesz zrobić
while
pętlę w skrypcie i będzie on działać wiecznie. Wystarczy dodać a,sleep 30
aby zmienić częstotliwość na 30 sekund. Nie polecam jednak robienia tego z dużą liczbą filmów, ponieważ poprzednie uruchomienie może się nie zakończyć przed rozpoczęciem następnego.Idealnie z cronjobem uruchamiam go co 5 minut.
źródło