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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:17:53