ใช้ ffmpeg เพื่อตัดวิดีโอ


333

ฉันใช้ ffmpeg เพื่อตัดส่วนของไฟล์ขนาดใหญ่เช่นนี้:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

ชิ้น-ssส่วนใช้งานได้ดี แต่-tถูกละเว้น จะลบวินาทีเริ่มต้นที่ระบุอย่างถูกต้องด้วย-ssแต่จากนั้นไปยังจุดสิ้นสุดของอินพุตด้วยสำเนา

มีวิธีใช้ ffmpeg เพื่อตัดส่วนท้ายของวิดีโอโดยไม่ต้องบันทึกใหม่หรือไม่?


1
ไวยากรณ์นี้ถูกต้อง
jiggunjer

คำตอบ:


393

คุณสามารถใช้-ssตัวเลือกเพื่อระบุเวลาเริ่มต้นและ-tตัวเลือกเพื่อระบุระยะเวลาการเข้ารหัส การประทับเวลาจะต้องอยู่ในHH:MM:SS.xxxรูปแบบหรือเป็นวินาที ( s.msec)

ต่อไปนี้จะคลิป 30 วินาทีแรกจากนั้นคลิปทุกอย่างที่เป็น 10 วินาทีหลังจากนั้น

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

โปรดทราบว่า-tเป็นตัวเลือกเอาต์พุตและจำเป็นต้องระบุเสมอหลังจาก -i

เคล็ดลับบางอย่าง:

  • สำหรับรุ่น ffmpeg ที่เก่ากว่าถ้าคุณใช้-ssหลังจาก-iนั้นคุณจะได้รับการค้นหาที่แม่นยำยิ่งขึ้นโดยเสียค่าใช้จ่ายในการดำเนินการที่ช้าลงไปด้วยกัน ดูเพิ่มเติม: ค้นหาด้วย FFmpeg
  • คุณสามารถใช้-toแทน-tการระบุการประทับเวลาที่คุณต้องการตัด ดังนั้นแทนที่จะ-i <input> -ss 30 -t 10ทำเช่นนั้น-i <input> -ss 30 -to 40เพื่อให้ได้สิ่งเดียวกัน

  • หาก ffmpeg ของคุณไม่รองรับ-cหรือ-toเป็นไปได้ว่าล้าสมัยมาก รวบรวมเวอร์ชั่นใหม่ด้วยตัวเองหรือดาวน์โหลดสแตติกบิวด์จากหน้าแรกของมัน มันไม่ซับซ้อนจริงๆ


1
@Mainain จริงแล้วคุณจะได้ความแม่นยำมากขึ้นในการใส่ -ss after และ slhck กล่าวถึงที่นี่ blog.superuser.com/2012/02/24/ … นอกจากนี้ในเอกสาร ffmpeg สำหรับ -ss มันกล่าวถึงความแตกต่างระหว่างการวางไว้ก่อนหรือหลัง
barlop

5
+1 ฉันมาที่นี่เพื่อหาวิธีละเว้นทุกสิ่งหลังจาก 35 วินาทีแรกขอบคุณ:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
สิ่งนี้ใช้ไม่ได้สำหรับฉัน (mp4) มันเพิ่งสร้างหน้าจอสีดำ 5 วินาที:frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
clocksmith

2
นี่ทำให้หน้าจอสีดำยาว 3-4 วินาทีในตอนเริ่มต้นของวิดีโอคลิปของฉัน การปรับเปลี่ยนของคริสโดยไม่-c copyใช้หน้าจอสีดำเริ่มต้นให้ดูคำตอบของเขาสำหรับรายละเอียด
joelostblom

4
คุณเขียน "ต่อไปนี้จะคลิป 30 วินาทีแรกจากนั้นคลิปทุกอย่างที่เป็น 10 วินาทีหลังจากนั้น:" <- นั่นหมายความว่าอย่างไร คุณหมายถึงรวมถึงคลิปด้วย 'cos clip อาจหมายถึง clip out สมมติว่าคุณหมายถึงรวมถึง คุณหมายถึงเริ่มจาก 30 วินาทีในและรวมเพียง 10 วินาทีจากที่นั่น? ถ้าอย่างนั้นฉันขอแนะนำให้คุณเขียนว่ามันจะชัดเจนมากขึ้น
barlop

94

ดังที่คนอื่น ๆ กล่าวไว้การใส่-ssก่อน (เร็วกว่า) หรือหลัง (แม่นยำยิ่งขึ้น) สิ่งที่-iสร้างความแตกต่างครั้งใหญ่ ส่วน "การค้นหาที่รวดเร็วและแม่นยำ" บนหน้าการค้นหา ffmpeg จะบอกคุณถึงวิธีการรับทั้งสองอย่างและฉันใช้มันและมันสร้างความแตกต่างอย่างมาก โดยทั่วไปคุณใส่-ssก่อนและหลัง-iให้แน่ใจว่าได้ปล่อยให้มีเวลาเพียงพอก่อนที่คุณต้องการเริ่มตัดเพื่อให้มีกรอบคีย์อื่น ตัวอย่าง: หากคุณต้องการสร้างคลิป 1 นาทีจาก 9 นาที 0 วินาทีถึง 10 นาที 0 วินาทีใน Video.mp4 คุณสามารถทำได้ทั้งสองอย่างรวดเร็วและแม่นยำโดยใช้:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

ครั้งแรก-ssค้นหาอย่างรวดเร็วถึง (โดยประมาณ) 8 นาที 0 วินาทีจากนั้นวินาที-ssค้นหาอย่างถูกต้องถึง 9 นาที 0 วินาทีและ-t 00:01:00นำคลิป 1 นาที 0 วินาที

นอกจากนี้ยังทราบจุดสำคัญนี้จากหน้าว่า "ถ้าคุณใช้-ssกับ-c:v copyการ bitstream ส่งผลให้อาจจะจบลงด้วยการเปลี่ยนแปลงเร็วไม่สามารถเล่นได้หรือออกจากซิงค์กับสตรีมเสียงตั้งแต่ ffmpeg ถูกบังคับให้ใช้เพียง / แยก I-เฟรม "

ซึ่งหมายความว่าคุณต้องเข้ารหัสวิดีโอซ้ำอีกครั้งแม้ว่าคุณต้องการเพียงแค่คัดลอกหรือเสี่ยงต่อการขาด ๆ หาย ๆ และไม่ซิงค์กัน คุณสามารถลอง-c copyก่อนได้ แต่ถ้าวิดีโอแย่คุณจะต้องทำใหม่อีกครั้ง


คำเตือนเดียวกันนี้ใช้กับ-c:a copyวิธีการค้นหานี้
jiggunjer

1
คำตอบที่ดีที่สุดวิธีนี้ทำงานได้ดีที่สุดสำหรับฉัน
Ondra Žižka

3
ดูเหมือนว่า "-ss" ตอนนี้รวดเร็วและแม่นยำใน ffmpeg 2.1+ โดยไม่ได้ระบุสองครั้ง trac.ffmpeg.org/wiki/Seeking
Conrad Meyer

25

ฉันพบว่าเมื่อ-ssรวมกับ-c copyการสับแบบครึ่งวินาทีในตอนเริ่มต้น

เพื่อหลีกเลี่ยงปัญหานี้คุณต้องลบ-c copy(ซึ่งยอมรับว่าจะทำ transcode)


4
มีคำตอบอื่นที่เกี่ยวข้องกับความแม่นยำ การเข้ารหัสใหม่ด้วยตัวเลือกเริ่มต้นมักไม่ใช่สิ่งที่คุณต้องการ!
Tomasz Gandor

Good point @TomaszGandor
Chris

1
ฉันไม่เข้าใจคำตอบของ @ TomaszGandor เลย แต่การลบ-c copyคงที่
Iulian Onofrei

14

ตนเอง

เปิดไฟล์ในเครื่องเล่นสื่อที่จะทำการแยกเฟรมล่วงหน้าและเล่นไฟล์ AVISynthด้วยข้อมูลเช่น:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

จากนั้นตัดด้วยรูปแบบเวลาที่แน่นอน:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

และ

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

ตอนนี้ทำไฟล์ txt ด้วยไฟล์วิดีโอที่มีเนื้อหาเช่น:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

เรียกใช้ ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

สำหรับ-tตัวเลือกของฉันไม่ทำงาน แต่-vframesทำงานได้ ผมชอบใช้#framesตั้งแต่ผมค่อนข้างจะตัด ffprobeI-กรอบรูปและฉันพบจีโอวิดีโอโดยใช้

บรรทัดคำสั่งที่ใช้งานได้สำหรับฉันคือ:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

โดยวิธีการวางไว้-ssข้างหน้า-iทำให้แตกต่างกันมากในเวลาดำเนินการ


1
ที่จริง-vframes(หรือ-frames:v) ควรมาหลังจาก-iเพราะมันเป็นตัวเลือกการส่งออก
slhck

5

เช่นเดียวกับ user225366 ตัวเลือก -t ใช้งานไม่ได้กับวิดีโอขนาดสั้น แต่ใช้กับวิดีโอที่ยาวกว่า สำหรับวิดีโอสั้น ๆ ดูเหมือนว่า -frames: v ดีกว่า นี่คือสิ่งที่ได้ผลสำหรับฉัน

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

- การแปลงโคเดกจำเป็นต้องเพิ่มหากวิดีโอมีเสียงเช่นเดียวกับคำตอบอื่น ๆ ที่แสดง


0

ฉันเห็นไม่มากพูดถึงเรื่องนี้ (ฉันไม่มีผู้เชี่ยวชาญดังนั้นอาจจะมีการจับ) แต่ถ้าไฟล์ของคุณมีลำธารอื่น ๆ เช่นคำบรรยายและข้อมูลเมตาอื่น ๆ เช่นบทและอื่น ๆ ก็เป็นไปได้ที่จะตัด / ตัดและเก็บสตรีมทั้งหมดด้วย คำสั่งดังต่อไปนี้

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

เมื่อ-map 0คุณนำสตรีมทั้งหมดในไฟล์และ-c copyคัดลอกทั้งหมดตามที่เป็นอยู่
การใช้การ-toข้ามการเริ่มต้น-ssจะตัดอินพุตวิดีโอตั้งแต่เริ่มต้นจนถึงวินาทีที่ 60

การเล่นซอmapก็มีประโยชน์เช่นกันหากคุณต้องการให้สตรีมเฉพาะเจาะจงถูกตัด (บางทีคุณอาจไม่ต้องการแหล่งกำเนิดเสียงทั้งหมดในไฟล์หรือมีเพียงคำบรรยาย)

ฉันใช้สิ่งนี้เมื่อฉันต้องการแยกไฟล์ MKV ขนาดใหญ่ที่ไม่สามารถจัดเก็บในที่เก็บ FAT32

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