ฉันจะเปลี่ยนขนาดเฟรมรักษาความกว้าง (โดยใช้ ffmpeg) ได้อย่างไร


21

ฉันใหม่สำหรับไซต์ StackExchange นี้และการใช้ FFmpeg encoder ฉันมีวิดีโอขนาด 720x480 (3: 2) ที่ฉันต้องการเปลี่ยนเป็น 720x406 (16: 9) เพื่อให้ตรงกับวิดีโออื่น ๆ ที่ฉันมีสำหรับไซต์ ฉันได้ลองชุดคำสั่งต่าง ๆ รวมถึง:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

สิ่งที่ฉันจบลงคือวิดีโอที่ลดขนาดลงตามความสูงที่ระบุ แต่ไม่ได้รักษาความกว้าง มันสิ้นสุดที่ 608x406 หรือราว ๆ นั้น วันนี้ฉันได้เล่นกับ FFmpeg GUI หลายรุ่นและดูเหมือนว่าพวกเขาจะทำแบบเดียวกัน

สิ่งที่จะเป็นตัวเลือกที่เหมาะสม / พารามิเตอร์ที่จะผ่าน (สมมติว่าฉันจะมีการควบคุมมากขึ้นผ่านบรรทัดคำสั่ง) เพื่อให้บรรลุขนาดเฟรมที่ต้องการ?

คำตอบ:


36

การใช้ตัวกรองมาตราส่วนจะทำ แต่ก็มีอีกเล็กน้อย

ffmpeg -i input.mov -vf scale=720x406 output.mov 

จะสร้างภาพยนตร์ที่มีขนาดพิกเซลที่ต้องการ แต่ถ้าคุณดูผลลัพธ์คุณจะพบว่ามันเพิ่มข้อมูลลงในข้อมูลเมตาเพื่อที่จะเล่นในอัตราส่วนเดียวกันกับต้นฉบับโดยใช้พิกเซลที่ไม่ใช่สี่เหลี่ยมจัตุรัส ดังนั้นหากคุณต้องการขยายภาพยนตร์ไปเป็นอัตราส่วนใหม่คุณต้องตั้งค่าอัตราส่วนพิกเซลด้วยตนเองเรียกว่า SAR สำหรับ "อัตราส่วนภาพตัวอย่าง" ดังนั้นสำหรับพิกเซลสี่เหลี่ยมใช้:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

หรือคุณสามารถตั้งค่าอัตราส่วนภาพที่แสดงตามที่คุณต้องการได้

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

สิ่งที่ฉันทำด้วยคำสั่ง -vf และ x = y, z = a แสดงออกว่าต่อไปนี้คือการสร้างห่วงโซ่ของฟิลเตอร์ ตัวกรองอาจค่อนข้างซับซ้อน แต่ในการใช้งานที่ง่ายที่สุดพวกเขาใช้แบบฟอร์มeffect=parameter,nexteffect=anotherparameterและพวกเขาจะได้รับการดำเนินการตามลำดับที่คุณเขียน

คุณอาจต้องการใส่คำสั่งเพิ่มเติมสำหรับตัวแปลงสัญญาณและอื่น ๆ เช่น-c:v libx264ใช้ตัวเข้ารหัส mp4 x264 และสิ่งที่ต้องการ-crf 20ตั้งค่าตัวประกอบอัตราคงที่เป็น 20 (โดยปกติแล้วจะเป็นการดีระหว่างขนาดและคุณภาพ) ดังนั้นคำสั่งที่สมบูรณ์แบบสมเหตุสมผลจะมีลักษณะ:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

โปรไฟล์หลักนั้นดีสำหรับความเข้ากันได้ของอุปกรณ์slowตัวเข้ารหัส libx264 ที่ตั้งไว้ล่วงหน้านั้นมีความสมดุลที่ค่อนข้างดีของความเร็วและคุณภาพดังนั้นนี่จึงเป็นวิธีการเข้ารหัสเว็บที่ดีโดยทั่วไป คุณสามารถทำให้เร็วขึ้นโดยใช้fastหรือveryfastช้าลงด้วยveryslowและplaceboจะทำให้ดีขึ้นเล็กน้อยกว่าveryslowโดยเสียเวลาในการประมวลผลมากขึ้น (ดังนั้นชื่อ)

BTW อย่าใช้ -c copyนั่นหมายถึงเพียงแค่คัดลอกวิดีโอและออดิโอสตรีมโดยไม่ต้องทำอะไรกับพวกเขาเลยดังนั้นไม่มีอะไรที่คุณทำในแง่ของขนาดตัวแปลงสัญญาณบิตเรต ฯลฯ จะมีผลกระทบใด ๆ


1
หากคุณกำลังใช้ ffmpeg รุ่นล่าสุดคุณไม่จำเป็นต้องกำหนด x264 เป็นตัวแปลงสัญญาณอีกต่อไป แต่มันอาจจะคุ้มค่าที่จะดูว่าคุณต้องการตั้งค่าแบบไหน
stib

1
ฉันคิดว่าข้อมูลเมตามีเฉพาะเขตข้อมูล DAR ดังนั้นการใช้งานจึงsetsarเป็นการตั้งค่า DAR โดยอ้อม?
jiggunjer

ฉันต้องใช้ "-c copy" แต่ในอีกด้านหนึ่งฉันต้องการปรับขนาดหน้าจอ ฉันจะบรรลุสิ่งนี้ได้อย่างไร
Dr.jacky

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