个人技术博客: fuqifacai.github.io
更多技术资讯下载: 2img.ai
相关配图由微信小程序【字形绘梦】免费生成
正文内容
压缩前的数据主流格式大致分两类: rgba 类型 yuv类型
也可参考连接:图像实战 - RGB、YUV图像格式介绍 - 简书 (jianshu.com)
rgba 类型:原理上由 rgba四个字节表示一个像素点的颜色 其中每个字节分别代表 红,绿,蓝,透明度的值
由于业务场景和需求的不通,又衍生出了不同的格式
第一类是只有三个通道 只有三原色 rgb 去除掉了透明度通道
第二类是 通道的顺序变化 比如 argb bgr(opencv中是这种排列) bgra
图像数据的排列也有区别,通常默认的多数是 交错式跑列 :(rgb)(rgb)(rgb) 表示三个像素点
平面式排列 : rrrgggbbb 表示三个像素点
yuv 类型 :为了减少图像在传输过程中的网络带宽占用,又由于人眼对亮度的感知强余对颜色的感知,所以此类型就牺牲了部分色度信息来减少数据的大小
具体原理参考:YUV数据格式是什么 - 开发技术 - 亿速云 (yisu.com)
y 通道指 亮度通道(灰度图黑白图就是纯亮度通道的图像)
uv 通道 颜色信息的通道
格式衍生: y u v 分辨代表三种通道 yuv420 (420 表示通道中的权重 uv通道只有y通道数据的一半大小)
内存中的排列 : yyy uv uv uv 表示三个像素点
以上是原图的理解和格式种类,下面介绍编码的种类和种类的区别
压缩编码从大类上分为有损压缩和无损压缩,但是都遵循香农定理
无损压缩: 压缩后的数据 = 解压缩后的数据 压缩前后 无损失
有损压缩 : 压缩前 != 压缩后 有损失 为了提交视频传输效率视频流都是有损压缩
下面具体说明主流的压缩方式比较:
大体分两类: 非关联压缩,帧关联压缩
非关联压缩: 输入一张原图,压缩后是一张独立的 压缩图片,典型的就是 mjpeg ,一张原图对应一张压缩后的图片
帧关联压缩:输入多张原图,压缩后输出多帧压缩后的数据,但是压缩后的图像会分组组内的图像帧相互关联的,非关键帧不能独立解压恢复
原因:为了提高压缩效率,在连续的图像中可以通过算法计算只需要以一个关键帧数据作为基础后面只需要计算出后一张图像的和前一针图像的运动矢量差就可以在解码的时候
根据运动矢量恢复出关键帧后面的图像,基于这个思路衍生出了这类帧关联压缩方式,大大减少了传输带宽,尤其是对于非运动的情况下带宽的占用则非常低
常见压缩比:
非关联压缩: mjpeg (1-20 倍压缩率)
帧关联压缩: h264 (100-150倍压缩率) h265(200-300倍压缩率) vp8 vp9
根据以上原理主流的帧关联压缩中帧种类分为关键帧和非关键帧(也叫参考帧) 压缩方式的不通非关键帧的种类也不同
像 h264 其中分为 I P B 三种参考帧,这三种帧的参考方式也有多重多样,这个在编码器调参中需要根据自己的业务场景进行调优,只做了解,就不做更深入的分析了
包装格式:
以上介绍完了压缩编码,还需要了解包装格式
所谓的包装格式就是把压缩好的图像帧数据根据标准协议进行包装,这样就可以对每一个压缩后的数据进行描述,在传输后解码播放的时候就大大方便
比如 MP4 flv MP3 rtp 这些都是对压缩后的视频帧的一个包装,记录描述了帧的序列,视频的持续时间等信息等