วิธีการตัดที่เฟรมที่แน่นอนโดยใช้ ffmpeg?


22

ฉันพยายามใช้ ffmpeg เพื่อตัดไฟล์วิดีโอในเวลาที่แม่นยำ ความช่วยเหลือ ffmpeg แสดงตัวเลือก -timecode_frame_start เพื่อระบุเฟรมเริ่มต้น แต่ฉันไม่สามารถรับคำสั่งนี้ให้ทำงาน วิดีโอที่ได้จะเริ่มต้นที่จุดเริ่มต้นของวิดีโอดั้งเดิมเสมอ นี่คือตัวอย่างของคำสั่งที่ฉันใช้:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

ฉันย้ายตัวเลือก timecode_frame_start ก่อนและหลังตัวเลือกอื่นโดยไม่มีการเปลี่ยนแปลงผลลัพธ์ มีตัวเลือกเพิ่มเติมที่ฉันต้องระบุหรือไม่ ฉันได้ลองใช้รูปแบบไฟล์หลายรูปแบบเช่น mkv, avi, mp4 และไม่ปรากฏว่ามีปัญหาเกี่ยวกับตัวแปลงสัญญาณ นี่คือไฟล์เดียวที่ฉันได้ลอง:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

ฉันพลาดอะไรไปรึเปล่า?


ปรากฏว่ามีคำตอบนี้ในรายการส่งเมล (และ NB ที่มีสำเนา -vcodec คุณไม่สามารถ "ตัด" รับเฟรมเฉพาะได้เนื่องจากมันสามารถซิงโครไนซ์เฉพาะกับ i-frames ได้อีกครั้ง
rogerdpack

@ user39364 ฉันถามในรายชื่อผู้รับจดหมายและปรากฎว่าตัวเลือกนี้ไม่ได้ทำตามที่ OP ต้องการ ผมยังได้เรียนรู้สิ่งใหม่ ๆ :)
slhck

เพิ่งทราบว่าฉันพบวิธีการตัดที่เฟรมแน่นอนโดยใช้meltดูไฟล์วิดีโอที่ถูกต้องจากบรรทัดคำสั่ง - Super User
sdaau

คำตอบ:


46

ฉันเพิ่งเรียนรู้ว่าการtimecode_frame_startใช้งานไม่ได้เช่นนี้ วิธีเดียวที่จะเริ่มต้นที่เฟรมเฉพาะคือการแปลงจำนวนเฟรมที่จะไวยากรณ์หรือss.ms hh:mm:ss.msดังนั้นหากวิดีโอของคุณอยู่ที่ 25 fps และคุณต้องการเริ่มที่ 133 เฟรมคุณจะต้อง

133/25 = 5.32

ดังนั้นวิ่ง

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

โปรดทราบว่าการตัดเฟรมที่แน่นอนด้วยการคัดลอกบิตสตรีม ( -c:v copy) เป็นไปไม่ได้เนื่องจากเฟรมบางเฟรมนั้นไม่มีการเข้ารหัสภายในและสามารถทำงานได้ด้วยตนเอง

-ss จะถูกต้องเฟรมเสมอ

หากคุณต้องการเข้ารหัสจำนวนเฟรมเฉพาะให้ใช้-frames:v:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

คุณมีตัวเลือกในการใช้ตัวกรองวิดีโอแต่การสนับสนุนด้านเสียงอาจไม่แน่นอน และเห็นได้ชัดว่าการค้นหาเฟรมยังคงไม่ใช่คุณสมบัติ คุณสามารถติดตามรายชื่อผู้รับจดหมาย FFmpeg-thread นี้สำหรับข้อมูลเพิ่มเติม:

คุณอาจใช้-vf selectสำหรับการเลือกเฟรมที่แม่นยำ (สิ่งที่ต้องการ -vf 'select=gte(n\,100)'ข้าม 100 เฟรมแรก)


3
สำหรับวิดีโอที่มีเฟรมดร็อป (เช่น 29.97fps) ที่เกิน 10 นาที คุณจะคำนวณเวลาของแต่ละเฟรมอย่างแม่นยำอย่างไร
GFoley83

select=gte(n\,100)วิธีการทำงาน แต่แสวงหาคือการรับประทานอาหารมากขึ้นประสิทธิภาพ หากคุณทดสอบโดยการเข้ารหัสเพียง 30 เฟรมต่อครั้งยิ่งวิดีโอที่ฉันเริ่มทำงานยิ่ง ffmpeg ใช้เวลานานขึ้นก็จะเสร็จสมบูรณ์เนื่องจากการค้นหา
อดัมให้สิทธิ์

6

ทางเลือก

-vf select =“ ระหว่าง (n \, start_frame_num \, end_frame_num ), setpts = PTS-STARTPTS "
เช่น,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

ตัดวิดีโอจาก (รวม) 200 ถึง (รวม) เฟรมที่ 300 ลำดับการนับเริ่มต้นจาก 0

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