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

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

  •  
  •   chengdawa · 2016-10-27 07:14:37 +08:00 · 1829 次点击
    这是一个创建于 2949 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在这个全民直播时代,用户对视觉信息表达越来越重视,也越来越强调提高视频主观质量的需求,今天,我们就带着这些用户问题,讨论下视频压缩编码这项技术
       1. 视频为什么要压缩?
      视频即连续的图像,数字化后的图像或视频信息是海量的,举一个具体的例子,摄像头拍摄的一幅静态图像空间像素点(画面大小,也即分辨率) 640*480 个,每个像素点由 RGB 三元素组成,每个元素由 8bit 二进制位表达,则一副数字图像的大小为:
       640*480*3*8 = 7372800 bits
      视频是由很多幅图像组成,人眼感知视频播放流畅一般为 24fps ( frame persecond ,简称 fps ),根据视觉暂留原理,要达到最基本的视频播放效果大约也需要 10fps 的速度,我们这里以 24fps 代表一般情况,电影胶卷都是以这个帧率在拍摄,也就是视频的 1 秒由 24 幅静态图像组成,则一秒产生的视频信号量为:
      
       640*480*3*8*24 = ?172 mbps,
      原始视频的大小由此可见,一秒耗尽 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 采用量化编码的有损编码方式,也正是利用了人眼视觉对高频细节部分不敏感的理论基础,将残差系数低频部分采用更细的量化参数,而高频部分则粗化量化,一般的视频压缩失真也正是这个阶段产生。
      当我们对视频压缩技术有个大概的了解之后,我们就可以回答:“如何提高观众端的视频清晰度呢?”,当给定的编码器压缩率达到极限时,我们唯一能做的就是提高视频编码码率了。
    yksoft1
        1
    yksoft1  
       2016-10-27 14:58:37 +08:00
    说得太浅,文章里说的 90%放到 H261 、 MPEG-2 里也是一样的。应该讲讲 H264 独特的方面,比如自适应分块大小、后过滤器那些
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1161 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:51 · PVG 07:51 · LAX 15:51 · JFK 18:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.