Dividir um vídeo usando o FFMPEG através da detecção de cena

16

Eu vi esse segmento, que quase exatamente faz o que eu quero, mas na verdade estou procurando dividir a detecção de cena.

Divida automaticamente grandes arquivos de vídeo .mov em arquivos menores em quadros pretos (mudanças de cena)?

Por exemplo, digamos que eu tenha uma mulher na tela a partir de 0:01 - > 0:05, então um homem em uma cena diferente de 0:06 - > 0:09 e uma segunda mulher na tela de 0:10 - > 0:14

Isso (idealmente) criaria três videoclipes diferentes. Eu realmente gosto disso até o nível do frame, se possível, com autodetecção para quando as cenas mudarem.

** ATUALIZADO **

Ok, eu comecei muito bem. Eu fiz o seguinte usando FFProbe:

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

O que me dá uma lista de timestamps que parecem estar exatamente certos! Agora o próximo passo - como faço para pegar essa lista de timestamps e inseri-los de volta no ffmpeg para dividi-la? Aqui está um exemplo dos timestamps.

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
    
por aronchick 02.10.2014 / 01:36

2 respostas

2

Você pode usar diretamente o ffmpeg para detectar e extrair cenas instantaneamente sem a necessidade de imprimir e analisar informações de quadros:

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

O -vsync vfr é necessário porque a extração de imagens não funciona com taxa de quadros variável por padrão, consulte # 1644 .

    
por 06.10.2017 / 12:29
3

Processe seu texto para obter seus timestamps e imprimi-los em um arquivo .txt, use o .txt no segmentador ffmpeg.

A precisão não será perfeita e há muitos problemas para os quais você pode entrar, a menos que você tenha controle total sobre o conteúdo recebido.

É importante notar que este tipo de trabalho é um tema atual de pesquisa, então, novamente, pode produzir resultados imperfeitos.

    
por 09.10.2014 / 07:03