แยกวิดีโอโดยใช้ 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
คุณสร้างวิดีโอเล็ก ๆ ได้อย่างไร? คำสั่งด้านบนสร้างภาพ png และไม่เล็กกว่า mp4 วิดีโอ
Juan Pablo Fernandez

3

ประมวลผลข้อความของคุณเพื่อรับการประทับเวลาของคุณและพิมพ์ในไฟล์. txt ใช้. txt ใน ffmpeg Seger

ความแม่นยำจะไม่สมบูรณ์แบบและมีปัญหามากมายที่คุณอาจพบเจอหากคุณไม่สามารถควบคุมเนื้อหาที่เข้ามาทั้งหมด

เป็นที่น่าสังเกตว่างานประเภทนี้เป็นหัวข้อการวิจัยในปัจจุบันดังนั้นอีกครั้งมันอาจให้ผลลัพธ์ที่ไม่สมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.