Разделите видео с помощью FFMPEG с помощью функции обнаружения сцены

17

Я видел этот поток, который почти точно делает то, что я хочу, но я на самом деле ищу разделение при обнаружении сцены.

Автоматически разбивать большие видеофайлы .mov на меньшие файлы с черными рамками (смена сцены)?

Например, допустим, у меня на экране женщина с 0:01 -> 0:05, затем мужчина с другой сцены с 0:06 -> 0:09 и вторая женщина с 0:10 - > 0:14

Это (в идеале) создаст три разных видеоклипа. Мне бы очень хотелось, чтобы он дошел до уровня кадра, если это возможно, с автоопределением, когда сцены меняются.

** ОБНОВЛЕНО **

Хорошо, я отлично стартую. Я сделал следующее, используя FFProbe:

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

Что дает мне список меток времени, которые кажутся совершенно правильными! Теперь следующий шаг - как мне взять этот список временных меток и ввести их обратно в ffmpeg, чтобы разделить его? Вот пример меток времени.

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
источник
Не редактируйте новый вопрос в существующем, задавайте новый вопрос и возвращайтесь к нему, чтобы узнать, как вы получили метки времени.
djsmiley2k в темноте

Ответы:

4

Вы можете напрямую использовать ffmpegдля обнаружения и извлечения сцены на лету без необходимости распечатывать и анализировать информацию кадров:

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

-vsync vfrТребуется , поскольку извлечение изображения не работает с переменной частотой кадров по умолчанию, см # 1644 .

Delgan
источник
Этот метод вылетает ffmpeg для меня с предупреждением More than 1000 frames duplicated.
ashleedawg
1
Как вы на самом деле создали небольшие видео? Приведенная выше команда создает изображения в формате png, а не в формате mp4.
Хуан Пабло Фернандес
3

Обработайте ваш текст, чтобы получить ваши метки времени и распечатайте их в файле .txt, используйте .txt в сегментаторе ffmpeg.

Точность не будет идеальной, и вы можете столкнуться с множеством проблем, если у вас нет полного контроля над входящим контентом.

Стоит отметить, что этот вид работы является актуальной темой исследований, поэтому он может привести к несовершенным результатам.

dstob
источник