使用OpenCV与OpenH264时H264编码文件大于MPEG-4文件的问题
问题原因及解决方案
核心原因
- 编码参数未显式配置,默认参数基准不一致:OpenCV的
VideoWriter不会自动对齐两种编码的画质/码率基准,你当前用的默认配置下,H264编码的目标质量远高于MPEG4(mp4v)的默认目标质量,最终输出的H264视频主观/客观画质都明显优于MPEG4版本,体积自然更大。 - OpenH264默认配置偏向实时场景:你使用的Cisco OpenH264编码库默认配置面向实时视频通话场景,默认关闭了高压缩比的慢编码算法,GOP(关键帧间隔)更小,码率控制策略偏向低延迟而非高压缩率,进一步拉高了输出体积。
- MPEG4默认编码质量偏低:OpenCV内置的mp4v编码默认启用了较快的低质量压缩配置,默认码率设置较低,最终输出的画质损失更大,体积也就更小。
验证方法
你可以直接播放两个输出视频对比画质,或者用ffmpeg计算两款视频的PSNR值,会发现H264版本的画质明显更好:同等画质下H264的压缩率比MPEG4高30%-50%的结论是成立的,只是你当前测试的两组输出画质不在同一水平。
修复方案
显式设置两种编码的码率/质量参数对齐基准,示例调整后的代码如下:
import cv2, os infile = 'SourceVideo.AVI' outfile1 = 'TestVideo-mpeg4.avi' outfile2 = 'TestVideo-h264.avi' TARGET_BITRATE = 2 * 1024 * 1024 # 统一设置为2Mbps码率 TARGET_GOP = 60 # 统一设置60帧一个关键帧 cap = cv2.VideoCapture(infile) # 初始化编码器 fourccmpeg4 = cv2.VideoWriter_fourcc('m','p','4','v') fourcch264 = cv2.VideoWriter_fourcc('h','2','6','4') mpeg4 = cv2.VideoWriter(outfile1, fourccmpeg4, 30, (1280, 720)) h264 = cv2.VideoWriter(outfile2, fourcch264, 30, (1280, 720)) # 手动对齐编码参数 mpeg4.set(cv2.VIDEOWRITER_PROP_BITRATE, TARGET_BITRATE) mpeg4.set(cv2.VIDEOWRITER_PROP_GOP_SIZE, TARGET_GOP) h264.set(cv2.VIDEOWRITER_PROP_BITRATE, TARGET_BITRATE) h264.set(cv2.VIDEOWRITER_PROP_GOP_SIZE, TARGET_GOP) # 可选:设置H264的CRF值(固定质量模式,数值越高压缩率越高、画质越低) # h264.set(cv2.VIDEOWRITER_PROP_QUALITY, 28) ret = True while ret: ret, frame = cap.read() if not ret: break mpeg4.write(frame) h264.write(frame) mpeg4.release() h264.release() cap.release() print('MPEG4 Size = ', os.path.getsize(outfile1), ' bytes') print('H264 Size = ', os.path.getsize(outfile2), ' bytes')
调整参数后再次测试,同等码率下H264版本的画质会明显优于MPEG4版本,同等画质下H264的体积会更小。
内容的提问来源于stack exchange,提问作者slalomchip
相关产品推荐
相关产品推荐

