Python+OpenCV合成截图视频:如何缩小AVI文件至接近PNG总大小?
解决OpenCV合成视频体积过大的问题
你当前代码里cv2.VideoWriter的第二个参数传了0,这会让OpenCV使用未压缩的视频格式(比如RAW),完全没有压缩,所以生成的AVI体积远大于原PNG总和。PNG本身是带压缩的图片格式,而未压缩视频会把每帧都存成原始像素数据,体积自然暴涨。
方案1:给AVI文件指定压缩编码(XVID)
AVI格式支持XVID编码,这是一种高效的MPEG-4压缩编码,能大幅降低体积。修改VideoWriter的初始化代码,指定对应的fourcc编码:
将原代码中这一行:
video = cv2.VideoWriter("movies/" + video_name, 0, 1, (width, height))
替换为:
# 指定XVID编码(适配AVI格式) fourcc = cv2.VideoWriter_fourcc(*'XVID') video = cv2.VideoWriter("movies/" + video_name, fourcc, 1, (width, height))
修改后生成的AVI文件会用XVID压缩,体积会接近原PNG总和(或略大,视频压缩算法与图片压缩逻辑不同,但不会出现几百倍的体积差)。
方案2:生成MP4格式(推荐,体积更小)
AVI格式的压缩效率不如MP4,若能接受MP4格式,用H.264编码(avc1或mp4v)能得到更小的体积:
- 修改视频文件名后缀为
.mp4:
video_name = image_folder.split("/")[-2] + ".mp4"
- 初始化
VideoWriter时指定H.264编码:
# 使用H.264编码(适配MP4格式) fourcc = cv2.VideoWriter_fourcc(*'avc1') # 若报错可替换为*'mp4v',取决于OpenCV支持情况 video = cv2.VideoWriter("movies/" + video_name, fourcc, 1, (width, height))
注意事项
- 确保OpenCV支持对应编码:部分精简版OpenCV未集成ffmpeg,会导致压缩编码无法使用。若出现报错,可安装完整版本:
pip install opencv-python-full - 帧率参数:当前设置为1fps,若需要更快的播放速度可调整数值(比如10、24),该参数不会直接影响视频体积(体积主要由编码和分辨率决定)
完整修改后代码示例(AVI+XVID)
import os import cv2 def movie(image_folder): video_name = image_folder.split("/")[-2] + ".avi" # 查找并排序PNG图片 images = sorted([img for img in os.listdir(image_folder) if img.endswith(".png")]) if not images: print("未找到PNG图片") return # 获取第一帧的尺寸信息 frame = cv2.imread(os.path.join(image_folder, images[0])) height, width, layers = frame.shape # 初始化带XVID压缩的视频写入器 fourcc = cv2.VideoWriter_fourcc(*'XVID') video = cv2.VideoWriter("movies/" + video_name, fourcc, 1, (width, height)) for image in images: file_path = os.path.join(image_folder, image) frame = cv2.imread(file_path) if frame is not None: # 确保图片读取成功 video.write(frame) video.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者user11419808
相关产品推荐
相关产品推荐

