Fractionner une vidéo à l'aide de FFMPEG via la détection de scène

17

J'ai vu ce fil, qui fait presque exactement ce que je veux, mais je recherche en fait un fractionnement sur la détection de scène.

Diviser automatiquement les gros fichiers vidéo .mov en fichiers plus petits avec des images noires (changements de scène)?

Par exemple, disons que j'ai une femme à l'écran de 0:01 -> 0:05, puis un homme dans une scène différente de 0:06 -> 0:09, et une deuxième femme à l'écran de 0:10 - > 0:14

Cela (idéalement) créerait trois clips vidéo différents. Je l'aimerais vraiment au niveau de l'image, si possible, avec une détection automatique lorsque les scènes changent.

** MIS À JOUR **

D'accord, je pars du bon pied. J'ai fait ce qui suit en utilisant FFProbe:

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

Ce qui me donne une liste d'horodatages qui semblent tout à fait exacts! Maintenant, l'étape suivante - comment puis-je prendre cette liste d'horodatages et les saisir à nouveau dans ffmpeg pour la diviser? Voici un exemple d'horodatage.

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
la source
Ne modifiez pas une nouvelle question dans la question existante, posez une nouvelle question et reportez-vous à celle-ci pour savoir comment vous avez obtenu les horodatages.
djsmiley2k dans l'obscurité

Réponses:

4

Vous pouvez directement utiliser ffmpegpour détecter et extraire des scènes à la volée sans avoir besoin d'imprimer et d'analyser les informations sur les cadres:

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

Le -vsync vfrest requis car l'extraction d'images ne fonctionne pas avec le taux de rafraîchissement variable par défaut, voir # 1644 .

Delgan
la source
Cette méthode plante ffmpeg pour moi avec un avertissement More than 1000 frames duplicated.
ashleedawg
1
Comment avez-vous réellement créé les petites vidéos? La commande ci-dessus crée des images png et non des vidéos mp4 plus petites.
Juan Pablo Fernandez
3

Traitez votre texte pour obtenir vos horodatages et imprimez-les dans un fichier .txt, utilisez le .txt dans le segmenteur ffmpeg.

La précision ne sera pas parfaite et il y a beaucoup de problèmes que vous pouvez rencontrer à moins que vous ayez un contrôle total sur le contenu entrant.

Il convient de noter que ce type de travail est un sujet de recherche actuel, donc encore une fois, il peut produire des résultats imparfaits.

dstob
la source