FFmpeg转换大JPG至HEIC失败,求兼容所有图片的命令优化方案
解决FFmpeg转换大尺寸JPG到HEIC时的编码器初始化失败问题
从你贴出的报错日志里,一眼就能看到关键问题:
x265 [error]: 图片宽度必须是指定色度子采样的整数倍
这是因为你指定了-pix_fmt yuv420p,而这个像素格式有硬性要求——视频帧的宽度和高度必须都是2的整数倍。但你输入的JPG分辨率是13333x4200,宽度13333是奇数,完全不符合libx265编码器的要求,所以才会出现编码器初始化失败的情况。
优化后的命令
给你两个可用的方案,按需选择:
方案1:输出HEVC码流(和你原来的输出格式一致)
ffmpeg -i sample.jpg -crf 12 -preset placebo -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p -f hevc bitstream.265
方案2:直接输出HEIC文件(更符合你的转换目标)
如果你是想得到可直接查看的HEIC图片,不需要单独的码流文件,可以去掉-f hevc参数,把输出后缀改成.heic:
ffmpeg -i sample.jpg -crf 12 -preset placebo -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p output.heic
关键参数解释
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2":这个滤镜会自动将输入图片的宽度(iw)和高度(ih)向下取整到最近的偶数,完美适配yuv420p的要求。如果想要向上取整(比如不想损失哪怕1像素),可以把trunc换成ceil,不过实际使用中向下取整的画质差异完全可以忽略。- 保留了你原来的
-crf 12(保证高画质)和-preset placebo(最高压缩率,代价是转换速度最慢)参数,如果你追求更快的转换速度,可以把placebo换成medium或者fast。
为什么PNG没问题?
大概率是你测试的PNG图片分辨率刚好都是偶数,或者FFmpeg处理PNG输入时默认做了分辨率对齐,但JPG解码器没有这个默认行为,所以需要手动添加滤镜来统一处理所有图片。
内容的提问来源于stack exchange,提问作者user9786394




