使用OpenCV H265编码视频体积过大及codec ID正确性咨询
一、HEVC codec ID是否正确
你代码中使用的hev1和hvc1都是HEVC(H.265)的标准合法FourCC编码标识,写法没有问题:
hev1是通用H.265封装格式hvc1是将编码参数集内嵌到样本描述中的格式,设备兼容性更好,苹果系列设备优先使用该标识
二、H.265输出文件远大于预期的原因
你遇到的体积异常问题和编码标识无关,是OpenCV VideoWriter的默认编码配置导致的:
- OpenCV的VideoWriter初始化时如果不指定任何编码参数,默认会使用近乎无损的极高码率运行H.265编码,甚至在系统缺少x265编码器时会 fallback 到无压缩的原始帧存储。你输出的65MB刚好对应100帧常规分辨率的原始未压缩视频体积,说明编码过程完全没有启用压缩优化。
- 此前你用H.264得到2.5MB的结果,大概率是当时的编码器默认带了压缩配置,或者你手动指定了码率/质量参数。
修复方案
代码修改
在初始化VideoWriter时添加码率、质量参数即可,示例修改如下:
import cv2 import os import re image_folder = 'backend/data' video_name = 'backend/h265/output.mp4' images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")] def natural_sort_key(s, _nsre=re.compile('([0-9]+)')): return [ int(text) if text.isdigit() else text.lower() for text in _nsre.split(s)] sorted_images = sorted(images, key=natural_sort_key) frame = cv2.imread(os.path.join(image_folder, sorted_images[0])) height, width, layers = frame.shape # 优先用兼容性更好的hvc1标识 fourcc = cv2.VideoWriter_fourcc(*'hvc1') # 指定码率,单位bps,5Mbps对应5*1024*1024,可根据实际体积需求调整 bitrate = 5 * 1024 * 1024 video = cv2.VideoWriter(video_name, fourcc, 27, (width,height), isColor=True) # 设置质量参数,数值越小质量越高、体积越大,23是x265默认中等质量 video.set(cv2.VIDEOWRITER_PROP_QUALITY, 23) for image in sorted_images: video.write(cv2.imread(os.path.join(image_folder, image))) cv2.destroyAllWindows() video.release()
额外注意事项
如果修改参数后体积仍然异常,可先运行print(cv2.getBuildInformation())查看FFmpeg模块是否已经开启x265支持,若未开启需要重新编译安装带x265编码器的OpenCV版本。
如果不需要通过代码编码,直接使用FFmpeg命令行处理会更稳定:ffmpeg -framerate 27 -i %d.jpg -c:v libx265 -crf 23 output.mp4
其中CRF参数控制质量,范围0-51,数值越小质量越高体积越大,23为默认值,调整到28可在几乎无肉眼画质损失的前提下降低30%左右的体积。
内容的提问来源于stack exchange,提问作者seshasai voggu
相关产品推荐
相关产品推荐

