使用OpenCV Python为现有视频追加图片:能否用cv2.VideoWriter实现?若不能,最优方案是什么?
关于用OpenCV向现有视频追加图片的问题解答
首先直接给结论:不能用cv2.VideoWriter直接打开现有视频并追加新图片。OpenCV的VideoWriter工具从设计上就只支持创建新视频文件,或者覆盖已有文件——它没有提供“追加模式”的参数,当你用它指向一个已存在的视频文件时,默认会清空原内容重新写入,根本做不到在末尾追加。
那最优解决方案是什么?其实就是“重混”:读取原视频的所有帧,加上要追加的图片(转成匹配的帧),一起写入一个新的视频文件。这个方法兼容性最好,也是OpenCV生态里最稳妥的做法。
具体步骤和代码示例
我给你写了一个可直接复用的函数,包含所有关键细节:
import cv2 import numpy as np def append_images_to_video(input_video_path, output_video_path, image_paths, img_display_duration=1): """ 向现有视频末尾追加图片 :param input_video_path: 原视频路径 :param output_video_path: 输出视频路径(不要和原视频路径相同,避免覆盖) :param image_paths: 要追加的图片路径列表 :param img_display_duration: 每张图片显示的时长(秒,默认1秒) """ # 1. 打开原视频,提取核心参数 video_cap = cv2.VideoCapture(input_video_path) if not video_cap.isOpened(): print(f"❌ 无法打开原视频:{input_video_path}") return # 获取原视频的帧率、分辨率、编码格式 fps = video_cap.get(cv2.CAP_PROP_FPS) frame_width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 提取原视频的编码格式(避免编码不兼容) fourcc_code = int(video_cap.get(cv2.CAP_PROP_FOURCC)) fourcc = cv2.VideoWriter_fourcc( chr((fourcc_code >> 0) & 0xFF), chr((fourcc_code >> 8) & 0xFF), chr((fourcc_code >> 16) & 0xFF), chr((fourcc_code >> 24) & 0xFF) ) # 2. 创建新的视频写入器 video_writer = cv2.VideoWriter( output_video_path, fourcc, fps, (frame_width, frame_height) ) if not video_writer.isOpened(): print(f"❌ 无法创建输出视频:{output_video_path},请检查编码格式是否支持") video_cap.release() return # 3. 写入原视频的所有帧 print(f"🔄 正在写入原视频内容...") while video_cap.isOpened(): ret, frame = video_cap.read() if not ret: break video_writer.write(frame) # 4. 处理并追加图片 print(f"🖼️ 正在追加图片...") for img_path in image_paths: img = cv2.imread(img_path) if img is None: print(f"⚠️ 无法读取图片:{img_path},跳过该图片") continue # 调整图片尺寸匹配原视频分辨率 resized_img = cv2.resize(img, (frame_width, frame_height)) # 根据时长循环写入图片(让图片显示指定秒数) frame_count = int(fps * img_display_duration) for _ in range(frame_count): video_writer.write(resized_img) print(f"✅ 已追加图片:{img_path}") # 5. 释放所有资源 video_cap.release() video_writer.release() cv2.destroyAllWindows() print(f"🎉 操作完成!输出视频路径:{output_video_path}") # 调用示例 if __name__ == "__main__": append_images_to_video( input_video_path="original_video.mp4", output_video_path="video_with_images.mp4", image_paths=["image1.jpg", "image2.png"], img_display_duration=2 # 每张图片显示2秒 )
关键注意事项
- 编码格式匹配:一定要用原视频的编码格式来创建新视频,否则可能出现输出视频无法播放的情况。上面的代码已经自动提取原视频的fourcc编码,不用手动指定。
- 图片尺寸适配:图片必须和原视频的分辨率一致,代码里已经做了自动resize处理,不用你手动调整。
- 大视频优化:这个代码是边读原视频边写入新文件,不会把所有帧都加载到内存里,所以即使处理几GB的大视频也不会有内存压力。
- 避免覆盖原视频:输出视频路径一定要和原视频不同,不然会直接覆盖原文件!
内容的提问来源于stack exchange,提问作者IronBCC
相关产品推荐
相关产品推荐

