我正在尝试将视频裁剪为 1080:1920 格式,它适用于大多数视频,但有时会失败并出现如下错误:
Invalid too big or non positive size for width '2304' or height '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"]})
时,我们收到一条错误消息:
Invalid too big or non positive size for width '112' or height '200'
为了解决该问题,我们可以检查是否 height*9/16 <= width
.
我们可以使用 OpenCV(或我们找到的任何其他包)获取视频分辨率( 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()
注意:我们实际上不必复制这部分代码(我使用复制来进行演示)。
关于python - FFmpeg 裁剪 : 'Invalid too big or non positive size for width ' 230 4' or height ' 4096',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70660235/