นี่คือวิธีการที่ใช้ FFmpeg เวอร์ชันปัจจุบัน มันขึ้นอยู่กับ demuxer ของ concat ที่ไม่ลดขนาด PTS ของอินพุตหลังจากไฟล์แรก แต่เพียงใช้อ็อฟเซ็ตคงที่ สมมติว่าคุณมีสตรีม 30 fps พร้อมไทม์สale 15360
(ปกติของเอาต์พุต FFmpeg) กรอบซึ่งหมายความว่า0
มี PTS 0
และกรอบ30
มี 15360
PTS นี่จะกลายเป็นสตรีม 45 fps ถ้าเราสามารถเปลี่ยนไทม์เซลเป็น23040
โดยไม่ส่งผลกระทบต่อค่า PTS
เป็นหลักนั่นคือสิ่งที่วิธีการด้านล่างทำ
1 . ระบุคุณสมบัติของแหล่งที่มา
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
30 fps, 30 tbr, 15360 tbn (default)
tbn
คุณต้องการที่จะทราบคุณสมบัติของแหล่งที่มาโดยเฉพาะอย่างยิ่งความละเอียดและ
2a (ไม่บังคับ) เปลี่ยนช่วงเวลาเป็นสิ่งที่สะดวกเพื่อให้การคำนวณง่ายขึ้น
ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4
สิ่งนี้ทำให้เรา
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
30 fps, 30 tbr, 30 tbn (default
ถ้าคุณทำตามขั้นตอนนี้ไทม์เซลใหม่ควรจะเท่ากันหรือเพิ่มตัวคูณของอัตราเฟรมดั้งเดิม
2b . คำนวณระยะเวลาที่จำเป็นเพื่อให้สำหรับ framerate เป้าหมายx
, PTS ของกรอบ # ในแหล่งที่มาควรจะมีค่าเช่นเดียวกับใหม่x
tbn
หากคุณดำเนินการตามขั้นตอนที่ 2a นี่เป็นเรื่องง่ายมากและเป็นเพียงแค่เฟรมใหม่ ดังนั้นสำหรับเฟรมต่อวินาทีเป้าหมาย45
ใหม่ที่ควรจะเป็นtbn
45
3 . สร้างวิดีโอหลอกตา
ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4
คุณสมบัติทั้งหมดควรเหมือนกันเช่นความละเอียด, โปรไฟล์ H.264, รูปแบบพิกเซล, นับการตอบกลับ .. เป็นต้นเพื่อผลลัพธ์ที่ดีที่สุด
4 เชื่อมต่อวิดีโอ
ก่อนอื่นให้สร้างไฟล์ข้อความ
file '0.mp4'
file 'in-v30.mp4'
จากนั้นการตกลง
ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4
ไฟล์ที่ส่งออกจะมีวิดีโอที่ 2 เล่นที่ 45 fps
5 . ทีนี้ลองตัด preroll จำลองออก
ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4
และคุณมี
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
45 fps, 45 tbr, 11520 tbn (default)
ฉันบอกว่าสิ่งนี้ถูกทำให้สับสน!
-r
เข้ากันไม่ได้กับการคัดลอกกระแสและไม่มีตัวกรองบิตสตรีมเพื่อเปลี่ยนอัตราเฟรม