V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuvhnfkw
V2EX  ›  程序员

网易视频云:视频压缩编码浅谈

  •  
  •   yuvhnfkw · 2016-10-26 18:52:51 +08:00 · 1826 次点击
    这是一个创建于 2710 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在这个全民直播时代,用户对视觉信息表达越来越重视,也越来越强调提高视频主观质量的需求,今天,我们就带着这些用户问题,讨论下视频压缩编码这项技术

    1. 视频为什么要压缩?

    视频即连续的图像,数字化后的图像或视频信息是海量的,举一个具体的例子,摄像头拍摄的一幅静态图像空间像素点(画面大小,也即分辨率) 640*480 个,每个像素点由 RGB 三元素组成,每个元素由 8bit 二进制位表达,则一副数字图像的大小为:

    视频是由很多幅图像组成,人眼感知视频播放流畅一般为 24fps ( frame persecond ,简称 fps ),根据视觉暂留原理,要达到最基本的视频播放效果大约也需要 10fps 的速度,我们这里以 24fps 代表一般情况,电影胶卷都是以这个帧率在拍摄,也就是视频的 1 秒由 24 幅静态图像组成,则一秒产生的视频信号量为:

    原始视频的大小由此可见,一秒耗尽 172m ,如果我们是在 4g 下直播,不到 6 秒就消耗 1g 流量,那直播不超过几分钟,流量包就爆啦,

    2. 视频为什么能压缩?

    压缩编码的前提是信息存在冗余,去掉冗余的信息,达到压缩的目的。那么视频信息有冗余么?当然有,视频信息作为普通的计算机信息数据一种,首先就存在着统计冗余,譬如我们发送一个视频文件给对方,我们会先尝试将其像其它普通文本文件一样用 zip 或 rar 压缩一下,减小一下空间和传输带宽消耗。其次,视频作为图像,存在空间冗余,一副数字化的图像各个像素点的值是缓慢变化的,像素值与其周围几个像素点的值具有很大的相关性,譬如一副图像的背景是一大片的红色,这很多一样的像素值就是空间上的冗余。再次,视频作为运动着的图像,存在时间冗余,即用视频采集设备拍摄的一幅幅图像之间是缓慢变化的,连续两个或多个图像之间是存在相关性的。最后,视频作为人眼视觉感知,存在视觉冗余,人眼对视频的激烈变化的部分往往不敏感,就如人耳对 20-20000 分贝以外的声音不明感一样,正是这种人眼视觉冗余,提供了我们视频有损压缩的前提条件。

    3. 视频如何压缩?

    压缩方法从大的方面分为 有损压缩,无损压缩,譬如我们用 zip 给任意文件打包压缩,压缩包能够通过解 zip 恢复成原来的文件,毫发无伤,所有数据信息没有任何丢失,这种压缩方式就是无损压缩,无损压缩有其卓越的优点:保真性,在一些卫星传图,医学 X 光图像视频等领域显得尤为重要,然后,它也有缺点,那就是压缩率不高,大概在 2 到 5 倍率 之间。

    另一种是 有损压缩,譬如压缩图像或者视频时,会根据人眼视觉感知特性,对那些人眼不敏感的数据不传输,牺牲一部分不重要的信息,来提高压缩率,当然压缩包经过解压也无法恢复那部分数据了,信息就丢失了,压缩解压后的图和原始的图是有差异的,这也就解释了 "主播看到自己的预览视频这么美,这么清晰,为什么观众看到的却有点模糊呢?"

    视频信息的压缩混合了有损以及无损压缩编码方法,一般我们直播应用中的视频压缩都是采用有损压缩方式,来提高压缩率,降低存储以及传输带宽,一般标准视频编码的压缩率能达到几十倍甚至几百倍

    4. 视频压缩编码的主流技术 H264 编码介绍

    从 上世纪八十年代的推出第一代视频编码标准 H120 开始到现在的下一代视频编码 H265 ,视频编码技术的发展一直吸引着工业界以及学术界的共同关注。其中国际组织:联合视频组(JVT)不遗余力的致力于视频编码标准的发展,不断提高视频压缩效率。

    从目前市场运用上看,无论是互联网应用,还是硬件芯片集成,最主流的视频编码技术依然是 H264,下面结合压缩理论简单介绍下 H264 所采用的编码技术

    1) 去除数据统计冗余: H264 采用两种熵编码方式: CAVLC ( 基于上下文的可变字长编码)和 CABAC (基于上下文的二进制算数编码), CAVLC 实现相对简单,编码效率高,但压缩率要比 CABAC 低 15%左右, CABAC 复杂度高,可以分场景采用不同的熵编码,让视频压缩后的平均码长接近信源熵值。

    2) 去除时间 shang 冗余: H264 采用帧间预测编码,当前像素块的编码参考之前已经编码重建帧的相应像素块,当前图像与前面的参考图像很相似(譬如视频画面相对静止)这时候帧间预测残差会很小,码率很低,相反,画面改变越大越快,帧间预测残差值就越大,压缩需要的 bit 数九越多,这也就解释了,当设定的最大允许码率一定的情况下“为什么主播的手机晃动起来,画面就有点模糊,不动就好清晰好清晰呢”。

    3) 去除空间冗余: H264 采用帧内预测编码方式,当前像素编码参考之前已经编码重建的像素值进行,如果像素变化缓慢,那么预测残差将会很小,甚至为 0 ,码率大大降低,这也就是为什么 我们传输黑色视频(手机摄像头被遮住),或者其他纯色视频,码率很低,设置的最大码率根本用不掉的原因。除此以外, H264 采用变换编码的方式,将残差从空间域利用 DCT(离散余弦变换)变换到频率域,结合差异量化编码方式,更进一步的去除空间冗余

    4) 去除人眼视觉冗余: H264 编码器的输入图像或视频的色彩空间采样格式一般为 YUV420,不同于 RGB 采样, YUV420 利用人眼视觉对像素亮度分量更敏感,而色度分量没那么敏感,进一步将图像或视频的色度分量做 2:1 的采样, 4 个亮度分量, 2 个色度分量,另外, H264 采用量化编码的有损编码方式,也正是利用了人眼视觉对高频细节部分不敏感的理论基础,将残差系数低频部分采用更细的量化参数,而高频部分则粗化量化,一般的视频压缩失真也正是这个阶段产生。

    当我们对视频压缩技术有个大概的了解之后,我们就可以回答:“如何提高观众端的视频清晰度呢?”,当给定的编码器压缩率达到极限时,我们唯一能做的就是提高视频编码码率了。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1273 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:50 · PVG 01:50 · LAX 10:50 · JFK 13:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.