如何用MoviePy裁剪视频并导出无黑边的裁剪片段?
解决MoviePy裁剪视频后保留黑边的问题
你的核心问题是当前用遮罩的方式只是把区域外像素涂黑,但视频分辨率仍保留原视频尺寸,所以导出后会带黑边。正确的做法是直接裁剪视频到目标区域的实际尺寸,而非用遮罩叠加。
实现思路
- 从已有的
top_left_crop、top_right_crop、bottom_right_crop、bottom_left_crop四个坐标中,计算出裁剪区域的最小/最大x、y值,明确裁剪边界 - 使用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
相关产品推荐
相关产品推荐

