เชื่อมต่อไฟล์ mp4 สองไฟล์ด้วย ffmpeg โดยไม่เสียคุณภาพ


16

ฉันต้องการเชื่อมต่อวิดีโอ 2 รายการโดยใช้ ffmpeg ฉันใช้:

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts

แต่ไฟล์ mp4 ที่ฉันดูแย่กว่านั้นคือไฟล์ต้นฉบับ

นี่คือข้อมูลเกี่ยวกับไฟล์ทั้งสอง

   Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
   Metadata:
   major_brand     : isom
   minor_version   : 1
   compatible_brands: isom
   creation_time   : 2013-06-13 15:40:36
   Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
   Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr,   12800 tbn, 50 tbc
   Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s

  Input #0, mpegts, from 'i0.ts':
  Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
  Program 1 
  Metadata:
  service_name    : Service01
  service_provider: Libav
  Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

ฉันจะแก้ปัญหานี้ได้อย่างไร


คุณพยายามทำอะไรกันแน่ คำว่า "concat" หมายถึงการเข้าร่วมไฟล์หลาย แต่คุณเป็นเพียงหมายถึงหนึ่งในการป้อนข้อมูลและการส่งออกหนึ่งoutput1.mp4 i0.tsการเข้ารหัสไปยังคอนเทนเนอร์เอาต์พุต TS จะใช้mpeg2videoตัวเข้ารหัสตามค่าเริ่มต้น (อย่างน้อยกับบิลด์ของคุณ) และครั้งสุดท้ายที่ฉันตรวจสอบการตั้งค่าบิตเรตหรือคุณภาพเริ่มต้นสำหรับโปรแกรมเปลี่ยนไฟล์นี้-b:v 200kซึ่งต่ำเกินไปสำหรับกรณีส่วนใหญ่
llogan

ขอโทษ จากนั้นฉันก็ต่อด้วย ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4 แต่ปัญหาคือคุณภาพไม่ดีอยู่แล้วเมื่อฉันทำไฟล์ ts

คุณอาจไม่จำเป็นต้องเข้ารหัสวิดีโอ MPEG-2 อีกครั้ง อินพุตดั้งเดิม ( output1.mp4ฯลฯ ) ทั้งหมดของคุณมีรูปแบบอัตราเฟรมและขนาดเฟรมเดียวกันหรือไม่
llogan

ใช่แน่นอน ทั้งหมด

คำตอบ:


36

พิจารณาใช้demuxerconcat วิธีนี้คุณสามารถหลีกเลี่ยงการสร้างไฟล์กลางชั่วคราวที่ทำให้สูญเสียและข้ามขั้นตอนเพิ่มเติมของการเข้ารหัส

หมายเหตุ:อินพุตทั้งหมดต้องมีประเภทสตรีมที่เหมือนกัน (รูปแบบเดียวกันฐานเวลาเดียวกัน ฯลฯ )

  1. สร้างไฟล์ข้อความและรวมถึงเส้นทางและชื่อของแต่ละไฟล์ที่จะต่อกัน (หรือ "เข้าร่วม") ไฟล์ตัวอย่างinput.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. ตอนนี้คุณสามารถใช้concatdemuxer:

    ffmpeg -f concat -i input.txt -codec copy output.mp4
    

หากคุณไม่มีคุณสมบัตินี้แสดงว่า ffmpeg ของคุณเก่าเกินไปหรือคุณใช้ ffmpeg "ปลอม" จาก libav fork

ง่ายต่อการใช้งานคงสร้างที่มีอยู่สำหรับ Linux, OS X และ Windows ผ่านทางดาวน์โหลด FFmpegหน้าหรือคุณสามารถทำตามคู่มือขั้นตอนโดยขั้นตอนในการรวบรวม ffmpeg

ดูเพิ่มเติมที่:


ตรงนี้เป็นสิ่งที่ฉันต้องการและช่วยฉันรวม 2 ไฟล์. mov จาก iPhone ของฉัน 6 ขอบคุณ
Ryan

7

1 ซับที่เร็วที่สุดจะเป็น:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4

มีโอกาสที่จะได้รับ 1-onliner สำหรับ windows command line ไหม?
PeterCo

2
บน Linux ฉันใช้ oneliner นี้: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv ยอมรับตัวแปลงสัญญาณมากกว่า mp4 แต่คุณสามารถลองกับ mp4 ได้) นี่-safe 0คือสำหรับรุ่น ffmpeg ล่าสุดที่บ่นเกี่ยวกับชื่อไฟล์ที่ไม่ปลอดภัยและ-type fเป็นไฟล์ที่มีรายชื่อเท่านั้น ฉันเพิ่ม| sortเพื่อจัดเรียงไฟล์ตามลำดับตัวอักษร; เพราะfindอ่านตามลำดับที่บันทึกไว้ในระบบไฟล์ ใช้งานได้กับไฟล์ที่มีช่องว่าง
erik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.