Розщеплення відео за допомогою 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

Не відредагуйте нове запитання у існуючому, не задайте нове запитання та зверніться до цього, щоб дізнатись про те, як ви отримали часові позначки.
djsmiley2k у темряві

Відповіді:


4

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

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

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


Цей метод вибиває ffmpeg для мене з попередженням More than 1000 frames duplicated.
ashleedawg

1
Як ви насправді створили маленькі відеоролики? Команда вгорі створює зображення PNG та не менше mp4 відео.
Хуан Пабло Фернандес

3

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

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

Варто зазначити, що цей вид роботи є актуальною темою дослідження, тому, знову ж таки, це може призвести до недосконалих результатів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.