OpenCV无法通过FFMPEG设置写入16位视频问题求助
解决OpenCV通过FFmpeg后端写入16位视频的问题
问题核心
你遇到的video.set(cv::VIDEOWRITER_PROP_DEPTH, CV_16U)返回false的原因是:OpenCV的FFmpeg后端不支持在VideoWriter.open()之后修改视频深度参数。编码器在初始化阶段就已根据输入帧格式、指定编码格式等确定了参数,后续无法通过set()方法更改。
正确实现方式
要写入16位视频,无需调用set()设置深度,而是要在初始化VideoWriter时,通过输入帧的格式隐式指定,具体步骤如下:
确保待写入的帧是CV_16U格式
输入图像必须是CV_16UC1(单通道16位无符号)类型的cv::Mat,若为其他格式需先转换:cv::Mat frame_16u; frame_8u.convertTo(frame_16u, CV_16U); // 从8位帧转换为16位帧正确初始化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 );写入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
相关产品推荐
相关产品推荐

