You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MoviePy处理竖屏视频时宽高互换问题求解

解决MoviePy处理竖屏视频时宽高互换的问题

问题场景

处理高度大于宽度的竖屏视频时,MoviePy输出的视频会出现宽高互换的异常,使用的代码如下:

def compress_video(old_video_filename, new_video_filename):
    video = VideoFileClip(str(UPLOAD_FOLDER) + str(old_video_filename))
    video.write_videofile(str(UPLOAD_FOLDER) + str(new_video_filename))

问题原因

多数竖屏视频实际是横屏拍摄后,通过视频元数据中的旋转标记实现竖屏显示。MoviePy默认只读取视频的像素宽高,忽略了旋转元数据,导致输出时直接按原始像素宽高渲染,出现宽高互换的情况。

解决方案

方案一:手动处理旋转元数据

读取视频的旋转属性,调整视频方向和宽高,确保输出正确:

from moviepy.editor import VideoFileClip

def compress_video(old_video_filename, new_video_filename):
    input_path = f"{UPLOAD_FOLDER}{old_video_filename}"
    output_path = f"{UPLOAD_FOLDER}{new_video_filename}"
    
    video = VideoFileClip(input_path)
    # 处理90度或270度旋转的竖屏视频
    if video.rotation in (90, 270):
        # 交换宽高并反向旋转,恢复正确显示方向
        video = video.resize(video.size[::-1]).rotate(-video.rotation)
    
    video.write_videofile(output_path)

方案二:通过FFmpeg参数处理旋转元数据

直接让FFmpeg自动识别并处理视频旋转元数据,无需手动调整:

def compress_video(old_video_filename, new_video_filename):
    input_path = f"{UPLOAD_FOLDER}{old_video_filename}"
    output_path = f"{UPLOAD_FOLDER}{new_video_filename}"
    
    video = VideoFileClip(input_path)
    video.write_videofile(
        output_path,
        ffmpeg_params=["-metadata:s:v:0", "rotate=0"]
    )

注:若需保留原视频的旋转元数据,可根据需求调整FFmpeg参数,具体可参考FFmpeg官方配置说明。

内容的提问来源于stack exchange,提问作者Martin Tošner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:44:58