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
相关产品推荐
相关产品推荐

