Tách video bằng FFMPEG thông qua Phát hiện cảnh


17

Tôi đã thấy chủ đề này, gần như chính xác những gì tôi muốn, nhưng tôi thực sự đang tìm cách tách để phát hiện cảnh.

Tự động chia các tệp video .mov lớn thành các tệp nhỏ hơn ở các khung màu đen (thay đổi cảnh)?

Ví dụ: giả sử tôi có một người phụ nữ trên màn hình từ 0h01 -> 0:05, sau đó một người đàn ông ở một cảnh khác từ 0:06 -> 0:09 và một phụ nữ thứ hai trên màn hình từ 0h10 - > 0:14

Điều này (lý tưởng) sẽ tạo ra ba video clip khác nhau. Tôi thực sự muốn nó xuống mức khung hình, nếu có thể, với tính năng tự động phát hiện khi cảnh thay đổi.

** CẬP NHẬT **

Ok, tôi đã có một khởi đầu tuyệt vời. Tôi đã thực hiện những điều sau bằng cách sử dụng FFPcoat:

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

Cung cấp cho tôi một danh sách các dấu thời gian có vẻ chính xác! Bây giờ bước tiếp theo - làm thế nào để tôi lấy danh sách dấu thời gian này và nhập lại chúng vào ffmpeg để phân chia nó? Đây là một ví dụ về dấu thời gian.

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

Đừng chỉnh sửa một câu hỏi mới thành câu hỏi hiện có, đặt câu hỏi mới và tham khảo lại câu hỏi này để biết cách bạn có được dấu ấn thời gian.
djsmiley2k - CoW

Câu trả lời:


4

Bạn có thể trực tiếp sử dụng ffmpegđể phát hiện và trích xuất các cảnh một cách nhanh chóng mà không cần in và phân tích thông tin khung:

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

Điều -vsync vfrnày là bắt buộc vì trích xuất hình ảnh không hoạt động với tốc độ khung hình thay đổi theo mặc định, xem # 1644 .


Phương pháp này sập ffmpeg cho tôi với cảnh báo More than 1000 frames duplicated.
ashleedawg

1
Làm thế nào bạn thực sự tạo ra các video nhỏ? Lệnh trên tạo hình ảnh png và video mp4 không nhỏ hơn.
Juan Pablo Fernandez

3

Xử lý văn bản của bạn để lấy dấu thời gian của bạn và in chúng trong tệp .txt, sử dụng .txt trong phân đoạn ffmpeg.

Độ chính xác sẽ không hoàn hảo và có vô số vấn đề bạn có thể gặp phải trừ khi bạn có toàn quyền kiểm soát nội dung đến.

Điều đáng chú ý là loại công việc này là một chủ đề nghiên cứu hiện tại vì vậy một lần nữa, nó có thể tạo ra kết quả không hoàn hảo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.