AviSynth ChangeFPS: การรวมวิดีโอกับ framerates ที่แตกต่างกัน


4

ฉันมีการบันทึกวิดีโอสองฉากในฉากเดียวกัน แต่ด้วยเฟรมเมอเรเตอร์ที่แตกต่างกันฉันต้องการรวมเข้าด้วยกันโดยใช้สคริปต์ AviSynth วิดีโอหนึ่งจะถูกบันทึกที่ 30fps และอีกหนึ่งที่ 120fps สิ่งที่ฉันต้องการจะทำคือการทำให้พวกเขาซิงโครไนซ์ชั่วคราวซึ่งหมายความว่าสำหรับแต่ละเฟรมของวิดีโอ 30fps ผลลัพธ์ที่ได้ควรแสดง 4 เฟรมจากวิดีโอ 120fps ฉันต้องการวิดีโอเอาต์พุตสุดท้ายเล่นที่ 30fps เพื่อให้ระยะเวลาเท่ากับ 4 เท่าของการบันทึกดั้งเดิม

จากเอกสารของ AviSynth ดูเหมือนว่าChangeFPSเป็นฟังก์ชั่นที่ฉันต้องการเพราะมันลบและทำซ้ำเฟรมในขณะที่ 'AssumeFPS' เพียงแค่เปลี่ยนความเร็วในการเล่น อย่างไรก็ตามตัวกรองดูเหมือนจะไม่ทำตามที่ระบุไว้

ถ้าฉันลอง:

clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")

ไม่ส่งผลต่อความเร็วในการเล่นหรือจำนวนเฟรมของคลิป 30fps เลย แต่จะลบทุก ๆ สี่เฟรมออกจากคลิป 120fps ซึ่งไม่ได้เป็นอย่างที่ฉันต้องการ น่าเสียดายที่การผนวก. ChangeFPS (7.5) เข้ากับ clip120 แทนจะไม่มีผลในทางกลับกันที่เหมือนกันในกรณีนี้มันจะทำสิ่งที่คาดหวัง หรือถ้าฉันลอง:

clip30 = AviSource("0326.avi").AssumeFPS(7.5)
clip120 = AviSource("0326-120fps.avi")

ไม่มีผลกระทบเลยทั้งสองคลิปถูกเล่นที่ 30fps ซึ่งหมายความว่ามีการแสดงคลิป 120fps เพียงหนึ่งในสี่เมื่อเวลาที่คลิป 30fps สิ้นสุดลง

ดังนั้นฉันจะรวมสองคลิปนี้ในลักษณะที่ต้องการได้อย่างไร ฉันไม่สามารถหาตัวกรองภายในหรือภายนอกอื่น ๆ ที่จะช่วยฉันได้ สำหรับฉันดูเหมือนว่าถ้าChangeFPSทำในสิ่งที่คู่มือบอกว่าจะเป็นสิ่งที่ถูกต้องสำหรับงาน


คุณต้องการรวมพวกเขาอย่างไร ในการแยกแนวตั้ง / แนวนอนหรืออย่างอื่น? .... clip30 = AviSource("0326.avi").ChangeFPS(120)ทำงานได้ดีสำหรับฉันเช่น มันส่งสัญญาณวิดีโอที่ 120 FPS ซึ่งทำงานในเวลาเดียวกับคลิป 30fps ดั้งเดิม
Peter.O

1
ฉันมีทั้งสคริปต์สำหรับการซ้อนและอีกหนึ่งสำหรับเลเยอร์ / การผสม; แต่มันก็ไม่สำคัญปัญหาคือฉันไม่สามารถเอาสองคลิปมาเล่นในเฟรมเมตาเรเตอร์ที่ต่างกันได้ สิ่งที่ฉันได้ออกมาคือวิดีโอขนาด 30 เฟรมต่อวินาทีที่มีปัญหาอย่างใดอย่างหนึ่งจากสองปัญหาที่ฉันระบุไว้ในคำถาม ตอนนี้ฉันได้พบสิ่งที่ฉันทำผิด แต่ฉันเพิ่งเขียนคำตอบอย่างรวดเร็ว
Daniel Saner

คำตอบ:


2

ฉันได้แก้ไขปัญหาของฉันโดยใช้ตัวอย่างข้อมูลแรกจากคำถามของฉัน (เปลี่ยนเฟรม 30fps ของคลิปเป็น 120fps) แต่จากนั้นตั้งค่าAssumeFPS(30)สำหรับวิดีโอสุดท้ายรวมกันโดยต่อท้ายฟังก์ชั่นนั้นจนสุดตัวกรองล่าสุดที่ฉันใช้ ตัวอย่างเช่น:

clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")
StackHorizontal(clip30, clip120).AssumeFPS(30)

ทำงานได้ดี ตอนนี้ฉันมีวิดีโอที่มีระยะเวลาของคลิป 120fps ที่ 30fps (สี่เท่าของระยะเวลาการบันทึกดั้งเดิม) กับเฟรมของ 30fps สี่เท่าทุกเท่าที่ฉันต้องการ

ฉันไม่รู้จริงๆว่าเพราะเหตุใดขั้นตอนสุดท้ายAssumeFPS(30)จึงเป็นสิ่งจำเป็นเนื่องจากคลิปที่ฉันได้รับหากไม่มีมันก็อยู่ที่ 30 เฟรมต่อวินาที ฉันได้ตรวจสอบเอาท์พุทแบบเฟรมต่อเฟรมใน AviDemux แล้วและหากไม่มีการเรียกครั้งสุดท้ายไปAssumeFPSแล้วเฟรมของclip30จะไม่เพิ่มเป็นสี่เท่าอย่างที่ควรจะเป็น

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