Podziel wideo za pomocą FFMPEG poprzez wykrywanie scen

17

Widziałem ten wątek, który prawie dokładnie robi to, czego chcę, ale tak naprawdę szukam podziału na wykrywanie scen.

Automatycznie dzielisz duże pliki wideo .mov na mniejsze pliki w czarnych ramkach (zmiany scen)?

Załóżmy na przykład, że mam kobietę na ekranie od 0:01 -> 0:05, potem mężczyznę w innej scenie niż 0:06 -> 0:09, a drugą kobietę na ekranie od 0:10 - > 0:14

To (idealnie) stworzyłoby trzy różne klipy wideo. Naprawdę chciałbym to zejść do poziomu klatki, jeśli to możliwe, z automatycznym wykrywaniem, gdy sceny się zmieniają.

** ZAKTUALIZOWANE **

Ok, zaczynam dobrze. Zrobiłem następujące przy użyciu FFProbe:

ffprobe -show_frames -of compact=p=0 -f lavfi "movie=foo.mp4,select=gt(scene\,.4)" > foo.txt

Co daje mi listę znaczników czasu, które wydają się być poprawne! Teraz następny krok - jak pobrać tę listę znaczników czasu i wprowadzić je z powrotem do ffmpeg, aby ją podzielić? Oto przykład znaczników czasu.

media_type=video|key_frame=1|pkt_pts=972221|pkt_pts_time=10.802456|pkt_dts=972221|pkt_dts_time=10.802456|best_effort_timestamp=972221|best_effort_timestamp_time=10.802456|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=5083698|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=0.503364
media_type=video|key_frame=1|pkt_pts=2379878|pkt_pts_time=26.443089|pkt_dts=2379878|pkt_dts_time=26.443089|best_effort_timestamp=2379878|best_effort_timestamp_time=26.443089|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=12736403|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=1.000000
media_type=video|key_frame=1|pkt_pts=2563811|pkt_pts_time=28.486789|pkt_dts=2563811|pkt_dts_time=28.486789|best_effort_timestamp=2563811|best_effort_timestamp_time=28.486789|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=13162601|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=0.745838
media_type=video|key_frame=1|pkt_pts=2627625|pkt_pts_time=29.195833|pkt_dts=2627625|pkt_dts_time=29.195833|best_effort_timestamp=2627625|best_effort_timestamp_time=29.195833|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=13485087|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=0.678877
aronchick
źródło
Nie edytuj nowego pytania do już istniejącego, zadaj nowe pytanie i powróć do tego, aby dowiedzieć się, w jaki sposób otrzymałeś znaczniki czasu.
djsmiley2k in darkness

Odpowiedzi:

4

Możesz bezpośrednio używać ffmpegdo wykrywania i wydobywania scen w locie, bez potrzeby drukowania i analizowania ramek:

ffmpeg -i foo.mp4 -vf select='gt(scene\,0.4)' -vsync vfr frame%d.png

Jest -vsync vfrto wymagane, ponieważ ekstrakcja obrazów domyślnie nie działa ze zmienną liczbą klatek na sekundę, patrz # 1644 .

Delgan
źródło
Ta metoda powoduje awarię ffmpeg z ostrzeżeniem More than 1000 frames duplicated.
ashleedawg
1
Jak właściwie stworzyłeś małe filmy? Powyższe polecenie tworzy obrazy PNG i nie mniejsze filmy MP4.
Juan Pablo Fernandez
3

Przetwórz tekst, aby uzyskać znaczniki czasu i wydrukuj je w pliku .txt, użyj .txt w segmencie ffmpeg.

Dokładność nie będzie idealna i istnieje wiele problemów, na które możesz natknąć się, chyba że masz całkowitą kontrolę nad przychodzącą zawartością.

Warto zauważyć, że ten rodzaj pracy jest aktualnym tematem badań, więc znowu może przynieść niedoskonałe wyniki.

dstob
źródło