FFmpeg执行tpad滤镜报错No such filter 'tpad'的问题求助
解决FFmpeg "No such filter 'tpad'" 报错并实现GIF最后一帧加延迟
你的FFmpeg版本是3.4.11,tpad滤镜是从FFmpeg 4.0版本才新增的功能,老版本无法识别这个滤镜,所以出现报错。下面提供两种解决思路:
方案一:升级FFmpeg(推荐)
对于Ubuntu 18.04,可通过第三方PPA升级到支持tpad的版本:
sudo add-apt-repository ppa:jonathonf/ffmpeg-4 sudo apt update && sudo apt upgrade ffmpeg
升级完成后,直接运行你原来的命令即可生效:
ffmpeg -i out.gif -vf tpad=stop_mode=clone:stop_duration=2 out2.gif
方案二:不升级,用旧版兼容方法实现
如果不想升级FFmpeg,可直接用以下命令给最后一帧添加2秒延迟:
ffmpeg -i out.gif -vf "select='eq(n,nb_frames-1)?loop=1:1',setpts='eq(n,nb_frames-1)?PTS+2/TB:PTS'" out2.gif
命令说明:
select='eq(n,nb_frames-1)?loop=1:1':选中最后一帧时额外循环显示一次,延长该帧的显示时长setpts='eq(n,nb_frames-1)?PTS+2/TB:PTS':给最后一帧的时间戳增加2秒,实现延迟效果
如果上述命令对GIF延迟处理不够准确,可尝试分步操作:
- 创建帧存储目录:
mkdir -p frames
- 提取原GIF的所有帧和调色板:
ffmpeg -i out.gif -vf palettegen palette.png ffmpeg -i out.gif -i palette.png -lavfi "paletteuse" -f image2 frames/frame_%04d.png
- 获取原GIF的总帧数:
frame_count=$(ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 out.gif)
- 复制最后一帧并设置延迟,重新合成GIF:
# 复制最后一帧用于延长显示 cp frames/frame_$(printf "%04d" $frame_count).png frames/frame_$(printf "%04d" $((frame_count+1))).png # 合成时给最后两帧设置2秒延迟(单位:厘秒) ffmpeg -framerate 6 -i frames/frame_%04d.png -i palette.png -lavfi "[0:v][1:v]paletteuse" -delay 1x$((frame_count)) -delay 200x$((frame_count+1)) out2.gif
(注:6是原GIF的帧率,需根据实际情况调整)
内容的提问来源于stack exchange,提问作者Zeek Aran
相关产品推荐
相关产品推荐

