如何用Python将16:9视频裁剪为9:16?求高效解决方案
高效Python实现16:9视频转9:16裁剪方案
一、原MoviePy代码问题分析
原代码仅加载了视频但未执行裁剪操作,且write_videofile未配置正确参数,导致导出黑屏无音频、耗时过长。
二、修正后的MoviePy方案
若仍偏好使用MoviePy,需添加裁剪逻辑并优化导出参数:
import moviepy.editor as mpy orig_video = "video.mp4" output_video = "cropped-video.mp4" # 加载视频并保留音频 video = mpy.VideoFileClip(orig_video, audio=True) original_width, original_height = video.size # 计算中心裁剪参数:目标宽度607px target_width = 607 x_start = (original_width - target_width) / 2 # 保留原视频高度(607/原高度≈9/16,匹配目标比例) y_start = 0 target_height = original_height # 执行裁剪 cropped_video = video.crop(x1=x_start, y1=y_start, x2=x_start + target_width, y2=y_start + target_height) # 高效导出:指定编码、多线程、硬件加速 cropped_video.write_videofile( output_video, codec="libx264", audio_codec="aac", preset="fast", threads=4, ffmpeg_params=["-hwaccel", "auto"] ) # 释放资源 video.close() cropped_video.close()
三、更高效的ffmpeg-python方案(推荐)
直接调用FFmpeg底层命令,比MoviePy封装效率高数倍,适合大体积视频处理:
1. 安装依赖
pip install ffmpeg-python
2. 自动探测原视频尺寸的实现代码
import ffmpeg orig_video = "video.mp4" output_video = "cropped-video.mp4" # 探测原视频分辨率 probe = ffmpeg.probe(orig_video) video_stream = next((s for s in probe['streams'] if s['codec_type'] == 'video'), None) original_width = int(video_stream['width']) original_height = int(video_stream['height']) # 计算中心裁剪参数 target_width = 607 x_start = (original_width - target_width) // 2 # 构建FFmpeg裁剪命令 ( ffmpeg .input(orig_video) .filter("crop", target_width, original_height, x_start, 0) .output( output_video, vcodec="libx264", acodec="aac", preset="fast", hwaccel="auto" ) .overwrite_output() .run(capture_stdout=True, capture_stderr=True) )
3. 手动指定参数(已知原视频为1920x1080时)
如果确认原视频是1920x1080的16:9规格,可省略探测步骤直接写死参数:
import ffmpeg orig_video = "video.mp4" output_video = "cropped-video.mp4" # 1920x1080视频中心裁剪607px宽度,起始x坐标为(1920-607)//2=656 ( ffmpeg .input(orig_video) .filter("crop", 607, 1080, 656, 0) .output(output_video, vcodec="libx264", acodec="aac", preset="fast", hwaccel="auto") .overwrite_output() .run() )
四、核心优化要点
- 硬件加速:通过
-hwaccel auto启用GPU加速,大幅缩短处理时间 - 编码预设:
preset=fast在画质损失极小的前提下提升编码速度 - 多线程利用:MoviePy的
threads参数和FFmpeg默认多线程配置可充分利用多核CPU
内容的提问来源于stack exchange,提问作者Levfo
相关产品推荐
相关产品推荐

