장면 감지를 통해 FFMPEG를 사용하여 비디오 분할


17

나는이 스레드를 보았습니다.이 스레드는 거의 정확히 내가 원하는 것을 수행하지만 실제로 장면 감지에서 분할을 찾고 있습니다.

큰 .mov 비디오 파일을 검은 색 프레임에서 작은 파일로 자동 분할합니까 (장면 변경)?

예를 들어 0:01-> 0:05에 화면에 여자가 있고 0:06-> 0:09와 다른 장면에 남자가 있고 0:10에 화면에 두 번째 여자가 있다고 가정 해 봅시다. > 0:14

이것은 (이상적으로) 세 가지 다른 비디오 클립을 만듭니다. 장면이 바뀔 때 자동 감지 기능을 사용하여 가능한 경우 프레임 수준까지 낮추고 싶습니다.

** 업데이트 **

좋아, 나는 좋은 출발을 시작했다. FFProbe를 사용하여 다음을 수행했습니다.

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

정확히 맞는 것처럼 보이는 타임 스탬프 목록을 제공합니다! 이제 다음 단계-이 타임 스탬프 목록을 가져 와서 ffmpeg로 다시 입력하여 분할하려면 어떻게해야합니까? 타임 스탬프의 예는 다음과 같습니다.

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

기존 질문으로 새 질문을 편집하지 말고 새 질문을 한 다음 타임 스탬프를 얻는 방법에 대해이 질문을 다시 참조하십시오.
어둠 속에서 djsmiley2k

답변:


4

ffmpeg프레임 정보를 인쇄하고 파싱 할 필요없이 바로 장면을 감지하고 추출하는 데 직접 사용할 수 있습니다 .

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

-vsync vfr이미지 추출 기본적으로 가변 프레임 속도와 작업을하지 않기 때문에, 필요한 참조되는 # 1644을 .


이 방법은 경고와 함께 ffmpeg 충돌 More than 1000 frames duplicated합니다.
ashleedawg

1
실제로 작은 비디오를 어떻게 만들었습니까? 위의 명령은 작은 mp4 비디오가 아닌 png 이미지를 만듭니다.
Juan Pablo Fernandez

3

타임 스탬프를 가져 와서 .txt 파일로 인쇄하려면 텍스트를 처리하고 ffmpeg 세그 먼터의 .txt를 사용하십시오.

정확성은 완벽하지 않으며 들어오는 콘텐츠를 완전히 제어하지 않는 한 많은 문제가 발생할 수 있습니다.

이 유형의 연구는 현재 연구 주제이므로 다시 불완전한 결과를 낳을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.