ใช้ FFMpeg เพื่อตัดวิดีโอเป็น 2 นาทีคลิป


5

ฉันมีวิดีโอนาน 10 นาทีซึ่งฉันต้องการตัดแบ่งออกเป็นสองส่วนสองนาที

ฉันสามารถใช้ ffmpeg เพื่อตัดวิดีโอตามเวลาที่กำหนดด้วยรายการต่อไปนี้:

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

ฉันต้องได้รับความยาวของวิดีโอก่อนแล้วจึงทำซ้ำคำสั่งข้างต้นหรือมีวิธีที่ง่ายกว่าในการทำเช่นนี้?

คำตอบ:


8
ffmpeg -i input.mp4 -map 0 -c copy -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4

... จะสร้างไฟล์ตามบรรทัดของ 'out01.mp4' out02.mp4 'แต่ละไฟล์มีระยะเวลา 120 วินาที (ยกเว้นไฟล์ล่าสุดซึ่งอาจสั้นกว่า) โปรดทราบว่าจะต้องแยกไฟล์ในคีย์เฟรมดังนั้นคุณจะไม่ได้รับการแยกที่แม่นยำ 100% ดูเอกสารส่วน

-force_key_framesหากคุณยินดีที่จะเข้ารหัสอีกครั้งคุณจะได้รับการแยกที่ถูกต้องโดยใช้ หากต้องการบังคับให้มีเฟรมหลักทุก 120 วินาทีและแยกโดยใช้เซกเมนต์:

ffmpeg -i input.mp4 -map 0 -c:v libx264 -preset veryfast -crf 22 -c:a libfdk_aac -vbr 3 \
-force_key_frames expr:gte(t,n_forced*120) -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4

หรือคุณสามารถใช้-gเพื่อกำหนดขนาด GOP - ซึ่งคุณต้องทราบอัตราเฟรมของวิดีโอของคุณ หากวิดีโอของคุณมีอัตราเฟรมที่ 25 เฟรมต่อวินาทีดังนั้น GOP ของ 120 * 25 = 3000 จะได้รับหนึ่งเฟรมหลักทุกสองนาที เห็นได้ชัดว่านี่มันน้อยเกินไป! การลดให้เหลือ 300 จะสมเหตุสมผลมากขึ้นและจะให้คีย์เฟรมกับสถานที่ที่คุณต้องการ:

ffmpeg -i input.mp4 -map 0 -c:v libx264 -preset veryfast -crf 22 -c:a libfdk_aac -vbr 3 \
-g 300 -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4

ตัวแปลงสัญญาณเฉพาะรุ่นที่รองรับ ffmpeg ของคุณอาจแตกต่างจากของฉัน (คุณไม่มี libfdk_aac เว้นแต่คุณจะรวบรวมจากแหล่งที่มา)


1
i=-120
infile=<inputfile>
while [[ "$?" == "0" ]]; do \
    ((i+=120)) \
    ffmpeg -ss $i -t 120 -i $infile ${infile/.mpg/.$((i/120)).mpg} \
done

ขอบคุณ explanatio ใด ๆ เกี่ยวกับเรื่องนี้: ${infile/.mpg/.$((i/120)).mpg}?
DocWiki

สมมติว่าส่วนขยายของ infile คือ.mpgควรสร้างไฟล์เอาต์พุตชื่อinfile.0.mpg infile.1.mpg infile.2.mpg ...
blahdiblah

การตรวจสอบด้วยffmpegเผยให้เห็นว่า$?สภาพจะไม่กระทบffmpegใด ๆเพราะไม่สนใจว่า-ssอยู่นอกช่วง การเปลี่ยนเงื่อนไขการออกตามการค้นหาความยาวของวิดีโอหรือไฟล์ที่ส่งออกไม่ว่างเปล่าเป็นแบบฝึกหัดสำหรับผู้อ่าน
blahdiblah

ออกกำลังกายที่ดี! MIN =ffmpeg -i ${1} 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | cut -d ":" -f 2
DocWiki

นี่คือรหัสของฉัน: stackoverflow.com/questions/6631971/…ข้อผิดพลาดบางอย่างไม่สามารถแก้ไขได้
DocWiki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.