簡體   English   中英

FFmpeg 裁剪:'寬度'2304'或高度'4096'的尺寸過大或非正數無效

[英]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)獲得視頻分辨率( 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()

注意:我們實際上不必復制代碼的一部分(我使用復制進行演示)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM