[英]Buttons overriding set height/width (appearing too big) when creating them in a for loop
[英]FFmpeg cropping: 'Invalid too big or non positive size for width '2304' or height '4096'
我正在嘗試將視頻裁剪為 1080:1920 格式,它適用於大多數視頻,但有時會失敗並出現如下錯誤:
寬度“2304”或高度“4096”的尺寸過大或非正數無效
這是我正在使用的代碼:
import ffmpy
ffmpy.FFmpeg(inputs={"input.mp4": None}, outputs={"output.mp4": ["-y", "-vf", "crop=ih*(9/16):ih,scale=1080:1920", "-preset", "ultrafast"]})`
錯誤的原因是ih*(9/16) > frame_width
。
我們不能裁剪超出框架邊界的矩形。
例如:
假設 input.mp4 的分辨率是 100x200(100 是寬度)。
ih = 200
ih*(9/16)
= 112.5
我們不能裁剪 112x200 像素,因為幀寬度只有 100 像素...
為了重現該問題,我們可以使用 FFmpeg(命令行工具)創建合成視頻:
ffmpeg -y -f lavfi -i testsrc=size=100x200:rate=1:duration=5 input.mp4
(合成視頻僅用於演示)。
執行時ffmpy.FFmpeg(inputs={"input.mp4": None}, outputs={"output.mp4": ["-y", "-vf", "crop=ih*(9/16):ih,scale=1080:1920", "-preset", "ultrafast"]})
,我們收到一條錯誤消息:
寬度“112”或高度“200”的尺寸過大或非正數無效
為了解決這個問題,我們可能會檢查height*9/16 <= width
。
我們可以使用 OpenCV(或我們找到的任何其他 package)獲得視頻分辨率( width
和height
)。
現在我們可以檢查if height*9/16 <= width
,如果條件為假,則使用其他裁剪參數。
代碼示例:
import ffmpy
import cv2
# Get video resolution using OpenCV
cap = cv2.VideoCapture('input.mp4')
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
cap.release()
crop_w = height*9/16
if crop_w <= width:
# We can do the cropping only when the cropped area is inside frame boundaries.
ff = ffmpy.FFmpeg(inputs={"input.mp4": None}, outputs={"output.mp4": ["-y", "-vf", "crop=ih*(9/16):ih,scale=1080:1920", "-preset", "ultrafast"]})
else:
ff = ffmpy.FFmpeg(inputs={"input.mp4": None}, outputs={"output.mp4": ["-y", "-vf", "crop=iw:iw*(16/9),scale=1080:1920", "-preset", "ultrafast"]})
ff.run()
注意:我們實際上不必復制代碼的一部分(我使用復制進行演示)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.