我已经使用了一段时间这两个命令将视频片段转换为动画gif,具有 ffmpeg
为它计算最佳调色板:
ffmpeg -ss $START -i $IN_FILE -t $LENGTH -vf "fps=$FPS,scale=$WIDTH:-1:flags=lanczos,palettegen" palette.png
ffmpeg -ss $START -i $IN_FILE -i palette.png -t $LENGTH -filter_complex "fps=$FPS,scale=$WIDTH:-1:flags=lanczos [x]; [x] [1:v] paletteuse" output.gif
这适用于本地文件,但如果我开始使用远程URL $IN_FILE
,它会下载所需的部分两次 - 一次用于调色板生成,一次用于实际转换。
提前下载完整文件通常是不可能的 - 通常我对较长视频中间的一个非常小的序列感兴趣。
我试着用下载一小部分 -ss
和 -t
并将其保存 - 无需重新编码 - 到临时文件:
ffmpeg -ss $START -i $IN_URL -t $LENGTH -vc copy -ac none temp.mkv
在这种情况下,我确实避免了带宽浪费(只下载文件的相关部分,只有一次),但搜索不再精确, 如 -ss
on input只有关键帧的粒度,用于在进行流复制时进行搜索 。
在理论上转换为gif时,可以进行额外的精确搜索并修复它,但似乎没有办法获得上面生成的临时文件的开始的原始时间戳,因此不可能计算我应该在哪里 -ss
当转码为gif时。我试过玩 -copy_ts
,但它没有产生任何好处。
简单的解决方案是在第一步中重新编码(可能在过程中应用缩放/重采样,以避免以后再进行两次),但我想避免一个额外无用编码的成本/质量损失。
那么:我如何执行最佳调色板视频转换为可能大型网络文件的一小部分的gif转换,有效地获取它(=下载一次,只有相关部分),精确搜索并且无需额外的重新编码?
[b]
,缓冲它像这样:[b]fifo[b];[b][pal]...