OpenCV4.6.0中VideoWriter_fourcc如何设置x264编码参数
OpenCV 4.6.0 配置VideoWriter x264自定义参数方案
原有代码问题修正
原有测试代码存在3处会导致运行/输出异常的问题,需要先修复:
capture.isOpened是对象方法,判断读取状态时必须加括号调用,即capture.isOpened()- 视频写入完成后必须调用
writer.release()写入文件尾,否则输出的mkv文件会损坏无法播放 - fourcc标记建议使用大写
X264,避免部分版本FFmpeg无法匹配到libx264编码器,不要使用h264标记,其对应内置编码器不支持crf参数配置
自定义编码参数配置方法
OpenCV 4.6.0的FFmpeg后端支持通过环境变量透传编码器私有参数,兼容性最好,不需要额外编译修改源码。你需要的pix_fmt yuv420p -preset ultrafast -crf 30参数可以直接通过该方式传入,参数会直接透传给libx264编码器生效。
修正后可直接运行的代码
import os import cv2 as cv # 初始化VideoWriter前配置FFmpeg透传参数,格式为 键=值; 分号分隔多个参数 os.environ["OPENCV_FFMPEG_WRITER_OPTIONS"] = "pix_fmt=yuv420p;preset=ultrafast;crf=30" capture = cv.VideoCapture('input.mp4', cv.CAP_FFMPEG) width = int(capture.get(cv.CAP_PROP_FRAME_WIDTH)) height = int(capture.get(cv.CAP_PROP_FRAME_HEIGHT)) fps = capture.get(cv.CAP_PROP_FPS) fourcc = cv.VideoWriter_fourcc(*'X264') writer = cv.VideoWriter('output.mkv', cv.CAP_FFMPEG, fourcc, fps, (width, height)) while capture.isOpened(): ret, frame = capture.read() if not ret: break writer.write(frame) if cv.waitKey(1) == ord('q'): break # 按顺序释放资源 writer.release() capture.release() cv.destroyAllWindows()
注意事项
- 如果运行时抛出找不到编码器的错误,说明当前安装的OpenCV绑定的FFmpeg没有编译libx264支持,需要更换为带全量编解码器的OpenCV安装包,或自行编译开启libx264依赖
- 该参数透传方式同样适用于其他FFmpeg支持的编码器,只要把参数按
键=值;的格式拼接进环境变量即可 - 如果需要输出mp4格式封装,直接把输出文件名改为
output.mp4即可,编码参数配置逻辑不变
内容的提问来源于stack exchange,提问作者imagesck
相关产品推荐
相关产品推荐

