zoom_video.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from moviepy.editor import VideoFileClip
  2. def zoom_and_crop_video(input_path, output_path, zoom_factor):
  3. """
  4. 放大视频画面并裁剪中心区域,保持原分辨率
  5. :param input_path: 输入视频路径
  6. :param output_path: 输出视频路径
  7. :param zoom_factor: 缩放倍数(需≥1)
  8. """
  9. # 加载视频并获取原始尺寸
  10. clip = VideoFileClip(input_path)
  11. original_width, original_height = clip.size
  12. if zoom_factor < 1:
  13. raise ValueError("缩放倍数必须≥1,否则无法裁剪出原始分辨率")
  14. # 放大视频
  15. zoomed_clip = clip.resize(zoom_factor)
  16. zoomed_width, zoomed_height = zoomed_clip.size
  17. # 计算裁剪区域中心坐标
  18. x_center = zoomed_width // 2
  19. y_center = zoomed_height // 2
  20. half_w = original_width // 2
  21. half_h = original_height // 2
  22. # 确定裁剪范围(确保不越界)
  23. x1 = max(0, x_center - half_w)
  24. y1 = max(0, y_center - half_h)
  25. x2 = min(zoomed_width, x_center + half_w)
  26. y2 = min(zoomed_height, y_center + half_h)
  27. # 裁剪并保存
  28. cropped_clip = zoomed_clip.crop(x1=x1, y1=y1, x2=x2, y2=y2)
  29. cropped_clip.write_videofile(
  30. output_path,
  31. codec='libx264',
  32. audio_codec='aac',
  33. bitrate='8000k' # 提高码率以保持清晰度[[20]]
  34. )
  35. # 释放资源
  36. clip.close()
  37. zoomed_clip.close()
  38. cropped_clip.close()
  39. if __name__ == "__main__":
  40. input_path = "oral_demo.mp4"
  41. output_path = "oral_demo_enlarge.mp4"
  42. scale_factor = 1.5
  43. # 调用示例
  44. zoom_and_crop_video(input_path, output_path, scale_factor)