การใช้trim
และconcat
- ไฟล์ต้นฉบับที่มีตัวแปลงสัญญาณที่แตกต่างกัน
สำหรับสิ่งนี้ตรวจสอบให้แน่ใจว่าไฟล์แต่ละไฟล์ของคุณมีความละเอียดเท่ากันและการรวมกลุ่มย่อยตัวอย่างแบบเฟรมและโครมาเดียวกันซึ่งจะช่วยป้องกันข้อผิดพลาดหรือความผิดพลาดระหว่างการต่อข้อมูล
คุณสามารถทำทุกอย่างได้ในครั้งเดียวโดยไม่ต้องแยกไฟล์โดยใช้ตัวกรองtrim
และconcat
:
ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4
ที่นี่trim
ใช้เพื่อระบุแต่ละส่วนของสตรีมวิดีโออินพุต ( 0:v
, 1:v
) ที่คุณต้องการเชื่อมต่อในภายหลัง ชิ้นส่วนเหล่านี้มีชื่อผ่านv0
v2
( setpts
ตัวกรองรีเซ็ตการประทับเวลาของแต่ละส่วนเหล่านี้เป็น 0 ซึ่งจำเป็นสำหรับการต่อข้อมูล) ต่อมาเราต่อสามส่วนเข้าด้วยกัน
หากคุณต้องการตัดแต่งจากการประทับเวลาที่แน่นอนไปยังจุดสิ้นสุดให้ใช้trim=start=15
แทนการระบุช่วง
หากไฟล์ของคุณมีเสียงคุณจะต้องตัดสตรีมเหล่านั้นแยกต่างหาก:
ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
โปรดทราบว่าวิดีโอและเสียงจะได้รับการเข้ารหัสอีกครั้งในกรณีนี้ - ตรวจสอบให้แน่ใจว่าได้ระบุเป้าหมายคุณภาพผลลัพธ์ที่เหมาะสม (เช่น-crf
สำหรับ x264, x265 หรือ libvpx-vp9) คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในวิกิพีเดีย FFmpeg เช่นการVP9หรือH.264
ใช้ส่วนบุคคล
หากคุณต้องการแยกคลิปและประกอบใหม่ในภายหลัง:
ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4
หากไฟล์มีเสียงให้ใช้แนวทางเดียวกันกับด้านบน:
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4
นี่จะเข้ารหัสวิดีโอสตรีมอีกครั้ง มันตรงไปตรงมามากกว่าเล็กน้อย แต่ก็ควรจะเทียบเท่ากับวิธีการข้างต้น
ใช้concat
demuxer
ในหลักการคุณสามารถลองเชื่อม bitstreams โดยไม่ต้องเข้ารหัสมันใหม่โดยใช้ concat demuxer สร้างไฟล์ชื่อconcat.txt
และเพิ่มรายการต่อไปนี้ (ตรงกับวิดีโอคลิปที่สร้างขึ้นด้านบน):
file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'
จากนั้นเชื่อมไฟล์แต่ละไฟล์เหล่านี้:
ffmpeg -f concat -i concat.txt -c copy output.avi
อย่างไรก็ตามสิ่งนี้ต้องการคลิปของคุณที่มีโคเดก, ความละเอียด, framerate และอื่น ๆ ที่เหมือนกัน - ดังนั้นมันจึงไม่สามารถทำงานได้กับแหล่งกำเนิดที่หลากหลายทุกชนิด
ใช้concat
โปรโตคอล
การต่อข้อมูลระดับไฟล์แบบข้างต้นสามารถทำได้โดยใช้concat
โปรโตคอลเช่นกันโดยมีข้อ จำกัด แบบเดียวกับข้างบน (โคเดกตัวเดียวกันความละเอียด ฯลฯ ):
ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการต่อข้อมูลให้อ่านหน้าFFmpeg Wiki ที่เกี่ยวข้อง