Dividir un video usando FFMPEG a través de la detección de escena


17

Vi este hilo, que hace casi exactamente lo que quiero, pero en realidad estoy buscando dividirme en la detección de escenas.

¿Divide automáticamente grandes archivos de video .mov en archivos más pequeños en cuadros negros (cambios de escena)?

Por ejemplo, supongamos que tengo una mujer en pantalla desde 0:01 -> 0:05, luego un hombre en una escena diferente desde 0:06 -> 0:09, y una segunda mujer en pantalla desde 0:10 - > 0:14

Esto (idealmente) crearía tres videoclips diferentes. Realmente me gustaría bajar al nivel de fotograma, si es posible, con autodetección para cuando cambien las escenas.

** ACTUALIZADO **

Ok, he tenido un gran comienzo. He hecho lo siguiente usando FFProbe:

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

¡Lo que me da una lista de marcas de tiempo que parecen ser exactamente correctas! Ahora, el siguiente paso: ¿cómo tomo esta lista de marcas de tiempo y las ingreso de nuevo en ffmpeg para dividirla? Aquí hay un ejemplo de las marcas de tiempo.

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

No edite una nueva pregunta en la existente, haga una nueva pregunta y consulte de nuevo cómo obtuvo las marcas de tiempo.
djsmiley2k en la oscuridad

Respuestas:


4

Puede usarlo directamente ffmpegpara detectar y extraer escenas sobre la marcha sin necesidad de imprimir y analizar información de cuadros:

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

Esto -vsync vfrse requiere porque la extracción de imágenes no funciona con una velocidad de fotogramas variable de forma predeterminada, consulte # 1644 .


Este método bloquea ffmpeg para mí con advertencia More than 1000 frames duplicated.
ashleedawg

1
¿Cómo creaste realmente los videos pequeños? El comando anterior crea imágenes png y no videos mp4 más pequeños.
Juan Pablo Fernández,

3

Procese su texto para obtener sus marcas de tiempo e imprímalas en un archivo .txt, use el .txt en el segmentador ffmpeg.

La precisión no será perfecta y hay muchos problemas con los que puede encontrarse a menos que tenga control total sobre el contenido entrante.

Vale la pena señalar que este tipo de trabajo es un tema de investigación actual, por lo que nuevamente, puede producir resultados imperfectos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.