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
źródło
Odpowiedzi:
Możesz bezpośrednio używać
ffmpeg
do wykrywania i wydobywania scen w locie, bez potrzeby drukowania i analizowania ramek:Jest
-vsync vfr
to wymagane, ponieważ ekstrakcja obrazów domyślnie nie działa ze zmienną liczbą klatek na sekundę, patrz # 1644 .źródło
More than 1000 frames duplicated
.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.
źródło