ตัดบางส่วนจากไฟล์วิดีโอจากตำแหน่งเริ่มต้นไปยังตำแหน่งสิ้นสุดด้วย FFmpeg [ซ้ำ]


143

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

ฉันมีไฟล์วิดีโอ 30 นาที แต่ฉันต้องการแยกวิดีโอจาก 00:09:23 ถึง 00:25:33

ฉันสามารถกำหนดจุดเริ่มต้นด้วย-ssแต่ไม่สามารถหาตำแหน่งสุดท้ายได้ ความช่วยเหลือใด ๆ โปรด?

คำตอบ:


244

ติดตั้ง ffmpeg

ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลดเวอร์ชันล่าสุดffmpegและอย่าใช้เวอร์ชันที่มาพร้อมกับการแจกจ่ายของคุณ (เช่น Ubuntu) เวอร์ชันที่ทำแพคเกจจากการแจกแจงต่าง ๆ มักจะล้าสมัยและไม่ทำงานตามที่คาดไว้

หรือรวบรวมมันด้วยตัวคุณเอง

วิธีตัดวิดีโอโดยไม่ต้องเข้ารหัสซ้ำ

ใช้สิ่งนี้เพื่อตัดวิดีโอจาก[start]สำหรับ[duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

ที่นี่ตัวเลือกหมายถึงสิ่งต่อไปนี้:

  • -ssระบุเวลาเริ่มต้นเช่น00:01:23.000หรือ83(เป็นวินาที)
  • -t ระบุระยะเวลาของคลิป (รูปแบบเดียวกัน)
  • ล่าสุดยังมีธงในการจัดหาเวลาสิ้นสุดด้วยffmpeg-to
  • -c copyคัดลอกบิตแรกของวิดีโอเสียงและคำบรรยายจากอินพุตไปยังไฟล์ที่ส่งออกโดยไม่ต้องเข้ารหัสพวกเขาอีกครั้ง สิ่งนี้จะไม่เป็นอันตรายต่อคุณภาพและทำให้คำสั่งทำงานภายในไม่กี่วินาที

วิธีตัดวิดีโอด้วยการเข้ารหัสซ้ำ

หากคุณไม่ใช้-c copyตัวเลือกนี้ffmpegจะเข้ารหัสวิดีโอและเสียงออกตามรูปแบบที่คุณเลือกโดยอัตโนมัติ สำหรับวิดีโอและเสียงคุณภาพสูงให้อ่านคู่มือการเข้ารหัส x264และคู่มือการเข้ารหัส AACตามลำดับ

ตัวอย่างเช่น:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

1
ในอูบุนตู 12:10, -c: v และ -c: a ไม่ทำงาน ฉันต้องใช้ "-acodec copy และ -vcodec copy" แทน
ซามูเอลลัมปา

1
@Samuel จากนั้นคุณกำลังใช้เวอร์ชันที่ล้าสมัยซึ่งไม่ได้เป็น FFmpeg จริง ๆ แต่เป็น Libav fork ดู: stackoverflow.com/a/9477756/1109017
slhck

ขอบคุณสำหรับสิ่งนี้! หากคุณไม่ได้ระบุระยะเวลามันจะสิ้นสุดหรือไม่
Jeff

@ เจฟฟ์ใช่! (อักขระขั้นต่ำ)
slhck

3
@Prateek เมื่อทำการคัดลอกบิตสตรีมวิดีโอ (แทนที่จะเข้ารหัสใหม่) คุณสามารถตัดได้ที่คีย์เฟรมเท่านั้น หากมีคีย์เฟรมในวินาที 1, 2 และ 3 แต่คุณต้องการตัดที่ 1.5 วินาทีจากนั้น ffmpeg จะรอจนถึงวินาทีที่ 2 ก่อนจึงจะเริ่มตัดได้ นั่นทำให้มันไม่ถูกต้อง
slhck

26

ฉันคิดว่าคุณสามารถใช้คำสั่งต่อไปนี้ตอนนี้

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

มีรูปลักษณ์ที่ยังDoc ffmpegหรือหน้าวิกินี้


6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFileเวอร์ชั่นที่เรียบง่าย
nwgat

3
ฉันต้องใช้ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4เวอร์ชัน (กับ-copyts) มิฉะนั้นมันจะตัดอย่างไม่ถูกต้อง (มีหน้าจอสีดำในตอนแรก) ขอบคุณสำหรับลิงค์ที่ 2
Necronomicron

นี่เป็นสิ่งที่ดีสิ่งสุดท้ายที่ฉันต้องการคือการคำนวณระยะเวลาจากจุดสิ้นสุด
Tomasz Gandor

อ็อพชัน -to ตอบคำถามที่ถูกถามจริง ส่วนที่เหลือของคำตอบนั้นไม่สำคัญหรือล้าสมัย
James Bowery

12

นี่คือแปลกที่ไม่มีใครแนะนำตัวกรองtrim

ปล่อยทุกอย่างยกเว้นนาทีที่สองของอินพุต:

ffmpeg -i INPUT -vf trim=60:120

เก็บเฉพาะวินาทีแรก:

ffmpeg -i INPUT -vf trim=duration=1

ปล่อยทุกอย่างยกเว้นจากวินาทีที่ 13 ถึงวินาทีที่ 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
ใช่ที่ดีที่จะพูดถึงและtrim atrimฉันมักจะใช้สิ่งเหล่านี้เมื่อทำการกรอง แต่ผู้ใช้ควรทราบว่าการกรองนั้นจำเป็นต้องเข้ารหัสใหม่
23790 llogan

คุณคือฮีโร่ของฉัน ฉันต้องการตัวกรองที่ทำสิ่งนี้ไม่ดี
fahadash

5

คุณสามารถใช้สองวิธีนี้สำหรับ Windows และ Linux

มีสองวิธีในการแบ่งไฟล์วิดีโอโดย ffmpeg คนแรกดีในตัวเองมากกว่านั้น - มันเร็วกว่า แต่บางครั้งก็สร้างไฟล์เอาต์พุตด้วยข้อบกพร่องบางอย่าง ดังนั้นในกรณีดังกล่าวมีวิธีที่สองในการแยกไฟล์วิดีโอ: มันช้ากว่ามาก, ไฟล์เอาต์พุตนั้นใหญ่กว่า, แต่ดูเหมือนว่าพวกมันจะมีคุณภาพระดับเดียวกับไฟล์อินพุตที่ใช้เสมอ

วิธีที่ 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

วิธีที่ 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>- จุดเริ่มต้นของส่วนของวิดีโอ ffmpeg คือการตัดออก รูปแบบ: 00:00:00.0000, หมายถึงชั่วโมง: นาที: วินาที: มิลลิวินาที

  • <duration>- ระยะเวลาของส่วนของวิดีโอ ffmpeg คือการตัดออก รูปแบบเดียวกับด้านบน

ตัวอย่าง:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg ตัดส่วนของไฟล์วิดีโอออกจาก 1 ชั่วโมง 19 นาที 0 วินาที ระยะเวลาของลำดับวิดีโอตัดออกเป็น 5 นาที 0 วินาที


ตกลงขอบคุณ จะตรวจสอบเอกสารและลองในวันพรุ่งนี้
juGGaKNot

3
-sameqไม่ได้หมายความว่า "คุณภาพเดียวกัน"และถูกลบออกจาก ffmpeg ใช้-codec copyแทน นอกจากนี้อย่าลืมตัว-toเลือก
llogan

ฉันแก้ไขคำสั่งในใบเสนอราคาของคุณเนื่องจากมันค่อนข้างล้าสมัย กรุณาอย่าคัดลอกข้อมูลโดยไม่ต้องอ้างอิงอย่างถูกต้อง
slhck

-1

คุณสามารถใช้สิ่งนี้

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

ที่นี่คุณจะต้องให้ระยะเวลาของวิดีโอ กล่าวคือ 00: 25: 33-00: 09: 23


1
ดังที่ฉันได้กล่าวถึงคำตอบอื่น ๆ : ด้วยคำสั่งของคุณคุณกำลังเข้ารหัสไฟล์อีกครั้งซึ่งไม่จำเป็นอย่างยิ่งและส่งผลให้คุณภาพลดลงและเพิ่มเวลาในการประมวลผล
slhck

-2

ฉันใช้ไวยากรณ์ต่อไปนี้เพื่อตัดวิดีโอด้วย ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t ใช้เพื่อตั้งค่าระยะเวลาเป็นวินาที - คุณไม่สามารถระบุเวลาสิ้นสุดได้ แต่สิ่งนี้น่าจะเหมาะกับคุณ


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