如何直接将多张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
相关产品推荐
相关产品推荐

