如果你正在看奥运会,各种血脉贲张,毛孔悚然,忍俊不禁,于是一拍大腿不吐不快:独乐乐不如众乐乐阿!别着急,腾讯视频已经可以满足你的愿望,让实时分享成为现实,请各位看官体验。方法:只要你登录v.qq.com ,对任何视频进行如下图所示的操作,就可以轻松,畅快地分享高清晰的gif动画了。



    效果如下:


    不光是奥运会,影视类视频你也可以玩的狠high:



    说起gif,可真的算是老古董了,1987年6月15日诞生的它,这个月刚过完25岁的生日。这个比万维网(www)(1991年)和第一个视频编码标准H.261(1990年)的历史都要长,1989年的版本(GIF 89a)中增加了 GIF 最为重要的透明色和多帧动画支持后,其标准就再也没有更新过,其间经历了Unisys公司要求专利权的风波,引入了强有力的挑战者png,经过20多年发展,互联网早已不是初期的龟速,gif以256色的成像,仍然屹立不倒,在网络图片格式中排名第二,实在是不折不扣的传奇。而随着微博的兴起,读图时代的到来, GIF喜闻乐见的表现手法非常适合在微博病毒传播,老树发新芽,GIF又焕发了新的活力。
   



    在线视频的浏览时长已经位居各种服务的首位,而其自身的优质内容,非常适合gif动画分享。但目前在线视频网站都没有提供这一功能,而基本只能在线下由专业软件编辑生成。究其原因,我们常见的网络视频的都是专业摄像机拍摄,不少片源还经过了调色师富有想象力的加工,其颜色层次非常鲜明丰富,再加上其YV12的编码存储格式,都对生成较好效果的gif动画提出了不小的挑战。而效果较好的算法,计算资源消耗较多,性能很难达到实时的要求。
    我测试了一些GIF开源工程,但没有效果和速度都能达到我们的应用需求的。于是先熟悉了GIF的编码格式标准,梳理了图像质量和性能相关的模块,从解码开始自己搭建框架。

GIF截图流程示意图



  
    以下分享下具体实现,欢迎感兴趣的同事一起交流讨论!

    优化图像质量方面,主要方法有:
    1 缩放使用了开源库自带的simd优化过的3抽头滤波的lanczos算法,理论上更高抽头的滤波器效果更好,当前版本先考虑性能待后续优化。
    2  YV12转BGR的矩阵最开始测试的是IPP自带的chroma upsampling算法,发现质量不高舍弃,经过探索,最后采用的转换原理如下:根据视频原始的颜色空间属性(如BT601)选择对应的V12-BGR24转换的矩阵,整个转换过程精度保持在11位以上,转换完毕后,通过dither:在低位增加了随机噪声再移位去除color banding。实现效果上优于vmr7,vmr9,evr等传统render。
    3  GIF为256色,而视频原始色彩范围为256^3=1600多万色,故必须进行颜色量化提取色板,这个话题比较大,这里直接说做法,使用了改良的Octree算法,其效果好于C#自带的Octree算法。关于Octree算法,这里不详细介绍,感兴趣的同学可以参考http://km.oa.com/group/481/articles/show/13155?kmref=search
   
    4  在颜色量化后进行误差扩散,使用Floyd–Steinberg抖动算法,进一步减少人眼能感受到的瑕疵。
    5  GIF动画的每一帧都单独计算自己的局部色板,以达到好的效果,相对全局色板每帧增加768个字节。
    性能优化上,进行的主要优化有:
    1  定位瓶颈为欧拉距离查找最接近颜色,使用SSE2指令改写,速度提升4倍。


    2  优化io,减少数据读写依赖。
    3  yv12-bgr24的高质量转换算法使用了SSE2指令改写。
    4  抖动算法使用循环缓冲区,增加cache命中。
    经过优化,GIF动画的截取可以在1秒左右完成计算。
   
    在特性实现,经过研究GIF的标准,实现了:
    1 隔行扫描编码格式,下载1/4帧的图像数据就能播放单帧图像,使图片在浏览器中更快的加载和显示,增加文件大小约2%。
    2 通过改变播放时每帧持续时间,达到快进或者慢放的效果。目前该功能还未对外。
    从最终的实现来看,效果上超出了大部分软件制作和网络传播gif的效果,一般视频截取的GIF都较清晰,当视频场景的颜色过于丰富色彩过渡过多时,或者运动模糊的太厉害时,效果会差些;速度上,请求,下载,计算,上传整个流程在3秒左右,基本达到了"实时"。
    后续的优化方向包括:
    1 优化GIF编码的性能,使现有服务器资源支持更多的并发请求的计算。
    2 继续优化GIF编码的质量,如通过优化缩放和Octree算法等。
    3 减小gif的体积,和研究院的同事讨论,结论是在不明显损伤画质的前提下可以节省15%的体积。
    4 增加个性化应用,如支持字幕添加,遮挡原始字幕等。