python - FFmpeg 裁剪 : 'Invalid too big or non positive size for width ' 230 4' or height ' 4096'

标签 python video ffmpeg

我正在尝试将视频裁剪为 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(或我们找到的任何其他包)获取视频分辨率( widthheight )。
现在我们可以检查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/

相关文章:

Android MediaMetadataRetriever.METADATA_KEY_DATE 仅给出 Galaxy S7 上的视频日期

python - 如何获取 Pytest 的代码覆盖率百分比值?

python - 如何将 GMT 时间转换为字符串时间

video - 如何在使用 ffmpeg libavformat 将 VP8 RTP 流复用到 webm 时从 RTP 时间戳设置 AVPacket 的 pts 和 dts?

c++ - OpenCV 找到最大的轮廓?

ffmpeg - 如何使用 libwebp for android 构建 ffmpeg?

python - 有条件地用 pandas 替换

python - 仅打印ROS中的起始位置和最终位置

video - 如何在 MP4 上叠加透明视频(mp4)?

ffmpeg - ffmpeg可以显示进度条吗?