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

如何用MoviePy裁剪视频并导出无黑边的裁剪片段?

解决MoviePy裁剪视频后保留黑边的问题

你的核心问题是当前用遮罩的方式只是把区域外像素涂黑,但视频分辨率仍保留原视频尺寸,所以导出后会带黑边。正确的做法是直接裁剪视频到目标区域的实际尺寸,而非用遮罩叠加。

实现思路

  1. 从已有的top_left_crop、top_right_crop、bottom_right_crop、bottom_left_crop四个坐标中,计算出裁剪区域的最小/最大x、y值,明确裁剪边界
  2. 使用MoviePy原生的crop()方法直接裁剪视频,该方法会输出仅包含目标区域的视频,分辨率与裁剪区域一致,自然消除黑边

修改后的完整代码

def crop_video():
    global cropped_base

    print("Cropping base video...")

    cropped_base = f"{id_folder}/3cropped_base-{id}.mp4"

    if os.path.exists(cropped_base):
        print("Cropped base video already exists, importing...\n")
    
    else:
        # 从四个裁剪坐标计算边界(假设每个坐标是(x, y)格式的元组)
        all_x = [top_left_crop[0], top_right_crop[0], bottom_right_crop[0], bottom_left_crop[0]]
        all_y = [top_left_crop[1], top_right_crop[1], bottom_right_crop[1], bottom_left_crop[1]]
        
        # 确定裁剪的上下左右边界
        left = min(all_x)
        right = max(all_x)
        top = min(all_y)
        bottom = max(all_y)

        clip = VideoFileClip(base_video)
        # 直接裁剪到目标区域,生成无黑边的裁剪视频
        cropped_clip = clip.crop(x1=left, y1=top, x2=right, y2=bottom)
        
        cropped_clip.write_videofile(cropped_base, audio=True, verbose=False)

        print("Cropped base video!\n")

关键说明

  • crop()方法的x1/y1对应裁剪区域左上角坐标,x2/y2对应右下角坐标,直接代入计算出的边界值即可
  • 无需再使用遮罩或叠加背景,裁剪后的视频分辨率即为(right-left, bottom-top),完全匹配目标区域
  • 保留原有音频导出设置,确保裁剪后的视频正常带音频

内容的提问来源于stack exchange,提问作者Pady

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:07:50