Dividi un video usando FFMPEG tramite il rilevamento delle scene


17

Ho visto questo thread, che fa quasi esattamente quello che voglio, ma in realtà sto cercando di dividere il rilevamento delle scene.

Dividi automaticamente file video .mov di grandi dimensioni in file più piccoli con cornici nere (cambi di scena)?

Ad esempio, supponiamo che io abbia una donna sullo schermo da 0:01 -> 0:05, quindi un uomo in una scena diversa da 0:06 -> 0:09 e una seconda donna sullo schermo da 0:10 - > 0:14

Questo (idealmente) creerebbe tre diversi videoclip. Mi piacerebbe davvero scendere a livello di frame, se possibile, con il rilevamento automatico per quando le scene cambiano.

** AGGIORNATO **

Ok, sono partito alla grande. Ho fatto quanto segue usando FFProbe:

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

Il che mi dà un elenco di timestamp che sembrano essere esattamente giusti! Ora il prossimo passo: come posso prendere questo elenco di timestamp e reinserirli in ffmpeg per dividerlo? Ecco un esempio dei timestamp.

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

Non modificare una nuova domanda in quella esistente, fare una nuova domanda e fare riferimento a questo per come hai ottenuto i timestamp.
djsmiley2k in darkness

Risposte:


4

È possibile utilizzare direttamente ffmpegper rilevare ed estrarre scene al volo senza la necessità di stampare e analizzare le informazioni sui fotogrammi:

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

Il -vsync vfrè necessario perché l'estrazione immagini non funziona con framerate variabile per default, si veda # 1644 .


Questo metodo blocca ffmpeg per me con un avviso More than 1000 frames duplicated.
ashleedawg,

1
Come hai creato i piccoli video? Il comando sopra crea immagini png e video mp4 non più piccoli.
Juan Pablo Fernandez,

3

Elaborare il testo per ottenere i timestamp e stamparli in un file .txt, utilizzare .txt nel segmenter di ffmpeg.

La precisione non sarà perfetta e ci sono un sacco di problemi che potresti incontrare a meno che tu non abbia il controllo totale sul contenuto in arrivo.

Vale la pena notare che questo tipo di lavoro è un argomento di ricerca attuale, quindi potrebbe produrre risultati imperfetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.