วิธีเชื่อมต่อคลิปจากวิดีโอเดียวกันกับ ffmpeg


15

ฉันมีวิดีโอยาวที่มีฉากต่างกันในนั้น ฉันต้องการแยกและเชื่อมต่อ 2 ฉากจากวิดีโอ (ที่ไม่ได้เริ่มในเฟรม I) โดยใช้ ffmpeg 2.1.4

สำหรับการโต้แย้งว่าฉันต้องการ 5 วินาทีจาก 01:00 และ 02:00

ฉันสามารถทำสิ่งนี้:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

นั่นให้ภาพยนตร์ที่ฉันต้องการ แต่จริงๆแล้วการเลือกบังคับให้ ffmpeg ถอดรหัสส่วนที่เหลือทั้งหมดของหนัง ฉันจะบอกให้ตัดทอนภาพยนตร์เรื่องแรกแทนที่จะถอดรหัสได้อย่างไร

ฉันต้องการทำเช่นนี้กับตัวกรองที่ซับซ้อน ffmpeg ถ้าเป็นไปได้ ฉันรู้ว่าฉันสามารถใช้-tเพื่อบันทึกภาพยนตร์แยกต่างหากก่อน แต่ขั้นตอนการเข้ารหัสพิเศษช้ามากในกรณีของฉันและยังสูญเสียคุณภาพที่เป็นธรรมสำหรับวิดีโอนี้

ฉันไม่สามารถหาตัวกรองที่ตัดความยาวของไอน้ำออก มีโหนดตัวกรองที่สอดคล้องกับ-tหรือ-ssพารามิเตอร์หรือไม่

คำตอบ:


16

ตัวกรอง concat

วิธีนี้จะดีที่สุดถ้าคุณต้องการทำการกรองเพิ่มเติม:

ใช้trim, atrim, setpts, asetptsและconcatฟิลเตอร์:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptsและasetptsจะป้องกันผลลัพธ์กระตุกเนื่องจากปัญหาการบันทึกเวลาการนำเสนอ

  • ตรวจสอบให้แน่ใจว่าใช้เวอร์ชันล่าสุด ดูหน้าดาวน์โหลด FFmpegสำหรับลิงค์เพื่อสร้างสำหรับ Windows, OS X และ Linux


concat demuxer

อีกวิธีหนึ่งคือการสร้างกลุ่มรายบุคคลและกระแสคัดลอกพวกเขาแทนการเข้ารหัส (เพื่อประหยัดเวลาและคุณภาพ) และพวกเขาเข้าร่วมกับdemuxer concat

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
อ่าขอบคุณ เล็มคือสิ่งที่ฉันขาดหายไป อย่างไรก็ตามมันใช้เวลานานมากในการชดเชยเวลาที่ฉันระบุราวกับว่าการถอดรหัสทุกอย่างขึ้นอยู่กับมัน นอกจากนี้ส่วนหนึ่งของสัญญาณเสียงขาดหายไป ในการแก้ไขฉันระบุอินพุตเดียวกันหลายครั้งด้วย -ss จากนั้นใช้การตัดแต่งเพื่อตัดวิดีโอ คุณไม่จำเป็นต้องมี setpts ในกรณีนี้เนื่องจาก ss ตั้งค่า pts เป็น 0 ซึ่งดูเหมือนว่าจะใช้งานได้และไม่มีการหยุดแบบสุ่มแปลก ๆ ระหว่างการเข้ารหัส สำหรับการคัดลอกลำธารฉันลองมาก่อน มันเริ่มต้นที่ I-frame ก่อนหน้าดังนั้นคุณจะได้รับส่วนต่าง ๆ ของภาพยนตร์มากกว่าที่คุณต้องการ
ดูถูก

คุณช่วยตอบคำถามของฉันมันคล้ายกับคำถามนี้ได้ไหม video.stackexchange.com/questions/18247/…
Eftekhari

-filter_complexผลงานที่น่าสนใจแต่concatไฟล์ไม่ได้ - เช่นวิดีโอที่ 1 ดูดี แต่คุณภาพของวิดีโอที่สองนั้นแย่มาก หมายเหตุฉันคัดลอกคำสั่งเหล่านี้สำหรับทั้งคู่ (ยกเว้นไฟล์อินพุต)
bobmarksie

7

สิ่งนี้จะทำงานได้เร็วขึ้น ...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

ไม่จำเป็นต้องระบุ -t ในเอาต์พุต ไม่จำเป็นต้องแยกเสียงและวิดีโอก่อนการประชุม


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