You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接将多张AVIF图片编码为单个动态AVIF文件?

如何直接将多张AVIF图片编码为单个动态AVIF文件?

我完全懂你不想绕弯子转GIF的心情,直接把多张AVIF拼成动态AVIF确实更高效。你之前踩的坑主要是通配符匹配、像素格式兼容还有命令参数搭配的问题,下面给你几个靠谱的解决方案:

方案1:用ffmpeg直接生成动态AVIF(最省心)

既然你已经装了FFmpeg 6.0,它本身就支持AVIF编码了,完全不用额外调用avifenc,一步到位就行:

ffmpeg -framerate 13 -pattern_type glob -i '*.avif' -c:v libaom-av1 -pix_fmt yuv420p10 -crf 30 -y output.avif
  • -framerate 13:设置动态图的帧率,你可以根据需要调整
  • -pattern_type glob -i '*.avif':让FFmpeg自己处理当前目录下所有AVIF图片的匹配,引号一定要加,防止shell提前展开通配符导致报错
  • -c:v libaom-av1:指定用AV1编码器(AVIF基于AV1标准)
  • -pix_fmt yuv420p10:设置AVIF兼容的10位YUV像素格式,避免编码失败
  • -crf 30:控制输出质量,数值越小质量越高(建议20-35之间调整)
  • -y:自动覆盖已存在的输出文件,不用每次确认

如果你的图片是按数字顺序命名的(比如frame1.avif、frame2.avif),也可以用序列匹配更稳妥:

ffmpeg -framerate 13 -i frame%d.avif -c:v libaom-av1 -pix_fmt yuv420p10 -crf 30 -y output.avif

要是文件名是两位数字(比如frame01.avif),就把%d改成%02d就行。

方案2:FFmpeg + avifenc 管道配合(解决之前的段错误问题)

如果你还是想用avifenc,那得把像素格式和管道传递的细节处理好,之前的段错误大概率是因为像素格式不兼容导致的,试试这个命令:

ffmpeg -framerate 13 -pattern_type glob -i '*.avif' -pix_fmt yuv420p10le -f yuv4mpegpipe - | avifenc --stdin --fps 13 output.avif
  • -pix_fmt yuv420p10le:指定小端模式的10位YUV格式,和avifenc的输入要求匹配
  • -f yuv4mpegpipe:让FFmpeg输出yuv4mpeg格式的数据流,方便avifenc读取
  • 管道后面的avifenc --stdin读取FFmpeg输出的数据流,同时指定--fps保持帧率一致

为什么之前的命令会报错?

你遇到的*.avif: No such file or directory错误,是因为shell没有正确展开通配符,或者FFmpeg没启用-pattern_type glob参数,把*.avif用单引号括起来让FFmpeg自己处理匹配就解决了;而段错误则是因为FFmpeg输出的像素格式和avifenc不兼容,指定正确的pix_fmt就能避免。

备注:内容来源于stack exchange,提问作者Undone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:08:04