错误原因是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(或我们找到的任何其他软件包)获得视频分辨率(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()
注意:我们实际上不必复制代码的一部分(我使用复制来演示)。