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


17

Eu vi esse tópico, que quase exatamente faz o que eu quero, mas na verdade estou procurando dividir na detecção de cenas.

Dividir automaticamente arquivos de vídeo .mov grandes em arquivos menores em quadros pretos (alterações de cena)?

Por exemplo, digamos que eu tenha uma mulher na tela entre 0:01 -> 0:05, depois um homem em uma cena diferente das 0:06 -> 0:09, e uma segunda mulher na tela entre 0:10 - > 0:14

Isso (idealmente) criaria três videoclipes diferentes. Eu realmente gostaria que fosse até o nível do quadro, se possível, com detecção automática para quando as cenas mudarem.

** ATUALIZADA **

Ok, estou começando bem. Eu fiz o seguinte usando o 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 carimbos de data e hora que parecem estar exatamente corretos! Agora, o próximo passo - como faço para pegar esta lista de carimbos de data e hora e inseri-los novamente no ffmpeg para dividi-lo? Aqui está um exemplo dos registros de data e hora.

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

Não edite uma nova pergunta para a existente, faça uma nova pergunta e consulte-a novamente para saber como você obteve os carimbos de data e hora.
djsmiley2k - CoW

Respostas:


4

Você pode usar diretamente ffmpegpara detectar e extrair cenas em tempo real, 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ária porque as imagens extração não funciona com framerate variável por padrão, consulte # 1644 .


Este método trava ffmpeg para mim com aviso More than 1000 frames duplicated.
ashleedawg 6/02

1
Como você realmente criou os pequenos vídeos? O comando acima cria imagens png e não vídeos mp4 menores.
Juan Pablo Fernandez

3

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

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

Vale a pena notar que esse tipo de trabalho é um tópico atual de pesquisa; portanto, novamente, pode produzir resultados imperfeitos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.