约莫两年前, 我测验考试改良FFmpeg对GIF编码的支撑,最少要很面子。特别是要在GIF编码器中参加通明机制。但是你写的代码其实不老是能使其到达最优,这类状况十分常用。但这依然只是禁止编码器堕入为难的测验考试。
不外比来在 Stupeflix,我们需求一个办法给 Legend app 生成高质量的 GIF,所以我决议在这上面再花些工夫。
一切在这篇博文 FFmpeg 2.6 中罗列的特征都是可用的,而且在Legend app的下一版本中将运用这些特征 (大约在3月26号摆布)。
文章太长不要去读:在Usage 部分存眷怎样运用便可。
其它翻译版本 (1) 加载中让我们看下2013年引入GIF编码器的通明机制的用处:
% ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1 -gifflags -transdiff -y bbb-notrans.gif % ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1 -gifflags +transdiff -y bbb-trans.gif % ls -l bbb-*.gif -rw-r--r-- 1 ux ux 1.1M Mar 15 22:50 bbb-notrans.gif -rw-r--r-- 1 ux ux 369K Mar 15 22:50 bbb-trans.gif
这个选项默许生效,当你的图片是高度活动的或者颜色变更激烈,你应当封闭它。
另外一个完成的紧缩机制是剪切,剪切是仅仅重绘GIF图中一个子矩形但不改动其他地方的根本手腕。固然在影片中,这么做用途不大,我们前面再谈。
除上述机制,之前我没有再获得甚么停顿。也多是其他办法不太分明,总之,在图片质量上还存在很多缺点。
你可能晓得,GIF 是受限于256色彩色板。而且默许状况下,FFmpeg 只运用一个通用调色版去测验考试掩盖一切的色彩区域,以此来支撑含有大量内容的文件:
运用颤动来防止堕入这个问题(256色限制),在上面的邦尼大熊兔GIF中,使用了有序Bayer颤动。经过它的8x8网状图案可以很随便地识别出来。虽然它不是最好的方法,可是它异样具有非常多长处,例如活泼,疾速,实践上可以避免带条效应和相似的视觉小缺点。
你将会发明大大多数的其它颤动办法都是基于误差的,道理是:一个单色误差(从调色板中遴选的色彩与想要的色彩之间的差别)将会传达到全部画面上。惹起帧之间的一种”群集效应“,乃至是帧之间完整类似的源的区域,但是这常常会供给一个更好的质量,由于它完整抹去了GIF的紧缩:
% ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1:sws_dither=ed -y bbb-error-diffusal.gif % ls -l bbb-error-diffusal.gif -rw-r--r-- 1 ux ux 1.3M Mar 15 23:10 bbb-error-diffusal.gif其它翻译版本 (1) 加载中
进步GIF图片质量的第一步就是定义一个更好的调色板。GIF格局存储了一个全局调色板,但你可以对一张图片(或者是子画面;掩盖在前一帧上的后一帧,但它可以掩盖在一个特定的偏移地位上以取得一个更小的尺寸)从头定义一个调色板。每帧的调色板都可以代替全局调色板来只对一帧起用处。一旦你中止定义一个调色板,它将会回落到全局调色板。这意味着你不克不及对一系列的帧定义一个调色板,而这恰好是你想做的。(典范的做法是在每一个场景变更的时分定义一个新的调色板)。
所以,换句话说,你需求恪守如许的形式:一个全局调色板,或者,每帧一个调色板。
其它翻译版本 (1) 加载中我最后Start在每帧入彀算出一个调色板,可是我发明了如许存在以下缺点:
开支: 一个256色彩色板巨细为768B,而且不包含在LZW 算法机制中,所以它没有被紧缩。同时因其必需贮存在每帧中,这就意味着关于25FPS的序列来讲会有每秒150千比特的开支( 768 *8 *25b =150 *1024b )。 固然大大多数时分这可以疏忽。
在我最后的测试傍边因为调色板的变更发生了亮度闪耀后果,这一点儿也欠好。
这就是我之所以没有运用这类办法而是选择盘算一个全局调色板来替代的两个缘由。如今我回忆起来,它可能与重试这类办法有关,由于在某种水平上,如今的颜色量化比我现在测试的时分的形态要好一些。
关于一系列的帧的每帧都运用类似的调色板(典范的做法是在场景变更时,就像后面提到的那样)也是可能的。或者,更好的做法是:只在子矩形变更时运用。
一切的这些都看成一个操练留给读者吧。欢送弥补,假如你对这个感兴味的话可以随时和我联络。
其它翻译版本 (1) 加载中具有一个全局调色板意思是一个2-pass(二次验码)紧缩方法(除非你情愿把一切的视频帧都存储在内存里)。
第一遍是对全部图片盘算一个调色板,这就是新的palettegen滤波器介入出去的地方。这个滤波器对每帧的一切色彩制造一个直方图,而且基于这些生成一个调色板。
其它翻译版本 (1) 加载中在技术层面上还存在一些杂事:这个滤波器完成了Paul Heckbert的这篇Color Image Quantization for Frame Buffer Display (1982)论文中的算法的一个变种。这里是我记得的一些分歧的地方(或者说是关于论文中不决义的行动的特异性):
它运用一个全剖析度的颜色直方图。而不是论文中作为关键建议运用的下采样 RGB 5:5:5 直方图,这个滤波器对1600万种可能的 RGB 8:8:8 颜色运用了一个哈希表。
对方格的联系任然是在中点长进行的,对要联系的方格的选择是依据方格中的色彩方差来实行的(一个带有大的颜色方差的方格将会优先截掉)。
对方格中的色彩求均匀值取决于色彩的主要性,就我而言,这在论文中并没有定义。
当沿着一个维度(红,绿或蓝)实行联系方格时,假设相等,绿色是优先于白色的,然后再是蓝色。
所以不论如何,这个滤波器都是在做颜色量化,而且生成一个调色板(凡是保管在一个PNG文件里)。
它凡是看起来像这个模样(upscaled):
第二遍(验码)是经过paletteuse滤波器完成的,就跟它的名字一样,它将会运用这个调色板来生成终极的量化色彩流,它的Task是在生成的调色板中找出最适宜的色彩来表现输出的色彩。这也是你可以选择运用哪一种颤动办法的地方。
这里异样有一些技术正面上的小问题:
滤波器完成了五种颤动办法,但是最后的论文中只提出了一种办法。
就像palettegen一样,颜色辨别率(将24-bit输出色彩映照到一个调色板条目上)的完成没有毁坏输出。它是经过一个K-d Tree(当k = 3时,很分明,每个维度都是RGB的构成部分)的迭代完成和一个缓存系统来到达这一目的的。
运用这两个滤波器可让你将GIF编码成如许(单全局调色板,无颤动):
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务