ffmpeg / avconv บังคับให้สเกลเอาต์พุตถูกหารด้วย 2


10

ฉันบันทึกเดสก์ท็อปของฉันด้วย avconv (aka ffmpeg) แล้วปรับขนาดเป็น 720p

ฉันเพิ่งเพิ่มสคริปต์ของฉันเพื่อให้พวกเขาสามารถเลือกหน้าต่างที่มี xwininfo และมันจะบันทึกหน้าต่างนั้นโดยเฉพาะ

อย่างไรก็ตามหากรูปแบบผลลัพธ์ไม่สามารถหารด้วย 2 ตัวเข้ารหัสจะแยกออกและฉันไม่ได้รับวิดีโอ

มีวิธีแก้ไขปัญหานี้ภายใน ffmpeg หรือไม่ดังนั้นฉันไม่ต้องทำคณิตศาสตร์ด้วยตนเองใน bash เพื่อตั้งค่ามาตราส่วน

เป็นไปได้ไหมที่จะมีการลบตัวกรองมาตราส่วน / เพิ่มความกว้าง / ความสูงถ้ามันไม่เท่ากัน? (รอบ?)

เป็นไปได้หรือไม่ที่จะใช้ตัวกรองอื่นหลังจากสเกลดั้งเดิมที่สามารถทำสิ่งนี้ได้ (สิ่งนี้จะวนวิดีโอที่มีขนาดอินพุตไม่สม่ำเสมอและไม่มีการปรับสเกล)

#!/bin/bash
avconv \
-f x11grab -r $fps -s $capturesize -i :0.0$offset \
-vcodec libx264 \
-vf scale=-1:720 \
-pre:v lossless_ultrafast \
-threads 4 \
-y $@

รายชื่อผู้รับจดหมายเก่าบางรายการแนะนำround()ฟังก์ชันที่คุณสามารถใช้ในตัวกรอง แต่ฉันไม่สามารถรับไวยากรณ์ได้ หากใช้งานscale=round(iw,2):round(ih,2)ตัวกรองที่ใช้ในตอนท้ายจะแก้ปัญหาทั้งหมดของฉันในครั้งเดียว iwและihดูเหมือนจะไม่ทำงาน

คำตอบ:


9

เนื่องจากการหารด้วย 2 เกิดขึ้นในจำนวนคี่บางครั้งมันควรจะเป็น:

-vf scale="trunc(oh*a/2)*2:720"

สิ่งนี้จะทำสิ่งที่ต้องการด้วย-1:720ไวยากรณ์ (คงอัตราส่วนภาพดั้งเดิมไว้)


ฉันใช้ceilแทนtruncเพื่อรับหมายเลขคู่ที่สูงกว่าเป็นกรณีของ 16: 9 480p
Felipe Alcacibar

8

จริงๆแล้วตัวกรองสามารถจัดการกับมันได้โดยตรง คุณต้องการเพียงส่งผ่าน-2แทนที่จะ-1ไปที่ตัวกรอง: เช่น

-vf scale="-2:720"

ฉันรู้สึกประหลาดใจที่จะหานี้ในรายงานข้อผิดพลาดจาก 3 ปีที่ผ่านมา


ใช้งานไม่ได้สำหรับฉันรุ่นขั้นต่ำที่รองรับสิ่งนี้คืออะไร
letmaik

3
-2 ใช้ได้กับฉันใน ffmpeg เวอร์ชั่น 2.3.3
Lance Nanek

7

หลังจากการทดลองเป็นจำนวนมากดูเหมือนว่าจะใช้ตัวกรองต่อไปนี้หลังจากตัวกรองขนาดอื่นจะปัดความกว้างและความสูงเป็น 2

scale=trunc(in_w/2)*2:trunc(in_h/2)*2

มันคือการหาร, กลม, คูณ, ผมแค่ไม่มีซินแท็กซ์ขวา

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