123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- from moviepy.editor import VideoFileClip
- def zoom_and_crop_video(input_path, output_path, zoom_factor):
- """
- 放大视频画面并裁剪中心区域,保持原分辨率
- :param input_path: 输入视频路径
- :param output_path: 输出视频路径
- :param zoom_factor: 缩放倍数(需≥1)
- """
- # 加载视频并获取原始尺寸
- clip = VideoFileClip(input_path)
- original_width, original_height = clip.size
-
- if zoom_factor < 1:
- raise ValueError("缩放倍数必须≥1,否则无法裁剪出原始分辨率")
-
- # 放大视频
- zoomed_clip = clip.resize(zoom_factor)
- zoomed_width, zoomed_height = zoomed_clip.size
-
- # 计算裁剪区域中心坐标
- x_center = zoomed_width // 2
- y_center = zoomed_height // 2
- half_w = original_width // 2
- half_h = original_height // 2
-
- # 确定裁剪范围(确保不越界)
- x1 = max(0, x_center - half_w)
- y1 = max(0, y_center - half_h)
- x2 = min(zoomed_width, x_center + half_w)
- y2 = min(zoomed_height, y_center + half_h)
-
- # 裁剪并保存
- cropped_clip = zoomed_clip.crop(x1=x1, y1=y1, x2=x2, y2=y2)
- cropped_clip.write_videofile(
- output_path,
- codec='libx264',
- audio_codec='aac',
- bitrate='8000k' # 提高码率以保持清晰度[[20]]
- )
-
- # 释放资源
- clip.close()
- zoomed_clip.close()
- cropped_clip.close()
- if __name__ == "__main__":
- input_path = "oral_demo.mp4"
- output_path = "oral_demo_enlarge.mp4"
- scale_factor = 1.5
- # 调用示例
- zoom_and_crop_video(input_path, output_path, scale_factor)
|