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

OpenCV无法通过FFMPEG设置写入16位视频问题求助

解决OpenCV通过FFmpeg后端写入16位视频的问题

问题核心

你遇到的video.set(cv::VIDEOWRITER_PROP_DEPTH, CV_16U)返回false的原因是:OpenCV的FFmpeg后端不支持在VideoWriter.open()之后修改视频深度参数。编码器在初始化阶段就已根据输入帧格式、指定编码格式等确定了参数,后续无法通过set()方法更改。

正确实现方式

要写入16位视频,无需调用set()设置深度,而是要在初始化VideoWriter时,通过输入帧的格式隐式指定,具体步骤如下:

  1. 确保待写入的帧是CV_16U格式
    输入图像必须是CV_16UC1(单通道16位无符号)类型的cv::Mat,若为其他格式需先转换:

    cv::Mat frame_16u;
    frame_8u.convertTo(frame_16u, CV_16U); // 从8位帧转换为16位帧
    
  2. 正确初始化VideoWriter
    直接传入16位帧的尺寸和类型相关参数,无需手动设置深度。推荐两种初始化方式:

    // 方式1:手动指定参数
    cv::VideoWriter video;
    bool opened = video.open(
        filename,
        cv::CAP_FFMPEG,
        cv::VideoWriter::fourcc('F', 'F', 'V', '1'),
        FPS,
        sz, // sz需与16位帧的尺寸完全一致
        false // 单通道模式,对应CV_16UC1
    );
    
    // 方式2:传入16位帧自动推导参数(OpenCV 4.x支持)
    cv::VideoWriter video(
        filename,
        cv::CAP_FFMPEG,
        cv::VideoWriter::fourcc('F', 'F', 'V', '1'),
        FPS,
        frame_16u.size(),
        false
    );
    
  3. 写入16位帧
    直接将CV_16UC1类型的帧写入即可:

    if (video.isOpened()) {
        video.write(frame_16u);
    }
    

验证输出

写入完成后,用FFmpeg命令行检查视频像素格式,确认是否为16位:

ffmpeg -i out2.mkv -show_streams

输出的pix_fmt字段应显示gray16le(对应OpenCV的CV_16U格式)。

额外注意事项

  • 确保使用的容器格式支持16位视频(MKV、AVI均支持,MP4可能受编码限制)
  • 你的FFmpeg 4.4.2已支持FFV1编码的16位格式,因此fourcc设置为FFV1是正确的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:32:57