本文介绍了GIF在现代应用中的劣势&优势,以及Vimeo对GIF的运用方法。
文 / Raphaël Zumer
原文链接 / https://medium.com/vimeo-engineering-blog/supporting-a-35-year-old-video-format-4cb9a62eae9
现在是2021年,视频编码完全被AV1等现代编解码器所主导。好吧,也不完全是。一个小小的,不屈不挠的格式仍然能够抵抗入侵者。对于那些想要提高视频质量的工程师来说,生活并不容易……
即使在今天,创建于1987年的Graphics Interchange Format(图形交换格式),或称 GIF (发音为“ JIF”) ,仍然是传输短动画或视频的最便携、最广泛支持的方式。尽管它每帧最多只支持256种颜色,压缩性能很差,而且不能包含音轨,但该格式的简单使其在电子邮件、论坛、社交媒体等应用中,以及在不支持现代替代品的传统系统中仍占据主导地位。由于该格式的限制,许多声称支持 GIF的平台实际上使用的是 h.264,这种格式被配置为在没有音频的情况下循环播放,以模拟实际的GIF。浏览器和移动设备可以轻松回放这些文件,它们在相同或更好的质量下提供更低的文件大小。然而GIF在支持方面仍然有优势。
在Vimeo,我们最近发布了一个功能,允许会员从他们的视频中创建GIF,嵌入到电子邮件中,并在任何平台上分享。与任何视频编码系统一样,我们需要考虑如何在保持合理的文件大小和编码时间的同时尽可能保持高质量。但由于压缩格式的能力有限,我们必须解决一些特有的相关问题,涉及图像量化、时间优化、速率控制和性能。
后台是一个由libimagequant和FFmpeg组成的系统。我们使用libimagequant对图像进行量化——减少每帧中使用的颜色数量,以满足格式的限制——同时最小化这一过程对质量的影响。这个优化步骤是复杂的,也是编码器中最耗时的部分。libimagequant还应用了抖动,它看起来类似于胶片的颗粒,并在生成的GIF中隐藏了量化可能产生的任何色带。然后,FFmpeg获取量化和抖动图像及其调色板,并将它们编码为实际的GIF格式。
为了提高量化质量和压缩性能,我们采用了预处理步骤来减少时间冗余。GIF可以有透明像素,在动画GIF中,可以利用这一点在不同帧之间只改变部分像素,保持其他像素的静态。如果视频中的背景在帧之间没有变化,我们可以通过对比连续帧的每个像素来避免对其颜色进行多次编码,当它们非常相似时,在后一帧中使其透明。我们使用一个简单的感知颜色距离测量来确定要成为透明的像素,这样就不会影响人眼看到的质量。
这套系统可以让我们用一些控制帧速率和大小的质量参数、量化质量和像素透明度的像素距离阈值来对GIF文件进行编码,但是还有一个我们需要解决的问题:速率控制。由于GIF是一种旧的格式,并没有针对视频编码进行优化,所以我们不能用同样的设置对每一个视频进行不加区分的编码,并期望合理的大小用于有硬性大小限制的电子邮件和平台。现代视频编码器通常包括内部速率控制机制,以调整质量以达到目标大小,但对于GIF,管理文件大小的方法有限:减少每帧颜色的数量,减少帧数,减少帧的大小。为了保持文件大小合理而不牺牲质量(除非必要),我们运行多个编码,根据需要逐步降低默认参数的质量,直到我们达到一个适当水平,尽可能少地损害质量。
对同一视频进行多次编码确实会导致整体响应时间更长,因此我们在多个级别上对它们进行并行处理,以保持合理的等待时间。目前,我们在收集结果并挑选出最终结果之前,以固定规模的批次运行编码,并且每个编码同时在多个帧上运行主要瓶颈,颜色量化。下面的活动示意图描述了系统的总体结构和程序流程。
GIF 创建系统的活动示意图
由于年代久远和格式的低复杂性,GIF永远不会像它们的源视频那样好看,但我们仍然有一些针对质量和性能的改进工作。通过电子邮件或社交媒体分享GIF片段是在朋友或关注者中创建视频兴趣的好方法。
现在我们所有的成员都可以使用这个功能,所以如果你想通过电子邮件或社交媒体在Vimeo上分享视频,在你的视频设置中找到GIF选项,并试一试!