# 目的:如何进行编码器的选择,在做编码效率测评的时候,需要去了解编码器的工作原理

# 简单知识储备

  1. 编码器类型:
  • H.264
  • H.265
  • 微帧
  • 底层编码器:opus、VP8、VP9、AV1 和 HEVC
  • ffmpeg开源库
  1. 音频编码 VS 音频解码
  2. 视频编码 VS 视频解码
  3. 编码器的各种帧(概念理解):
  • I帧:关键帧。是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是I帧。
  • I帧与IDR帧的区别:
  • P帧:“向前预测”。需要参考前面的I帧和/或P帧的不同部分,才能进行编码。P帧对前面的P和I参考帧有依赖性。但是,P帧压缩率比较高,占用的空间较小。
  • B帧:“双向预测”。以前帧后帧作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)。
  • 对于I-帧,整幅图像直接进入编码过程。对于P-帧和B-帧,首先做运动补偿。
  • 通常来说,由于相邻帧之间的相关 性很强,宏块可以在前帧和后帧中对应相近的位置找到相似的区域匹配的比较好,这个偏移量作为运动向量被记录下来,运动估计重构的区域的误差被送到编码器中编码。
  • GOP是由固定模式的一系列I帧、P帧、B帧组成。常用的结构由15个帧组成,具有以下形式 IBBPBBPBBPBBPBB。GOP中各个帧的比例的选取和带宽、图像的质量要求有一定关系。
  • 例如因为B帧的压缩时间可能是I帧的三倍,所以对于计算 能力不强的某些实时系统,可能需要减少B帧的比例。
  • 包比GOP的单位更小,单位多少个字节。GOP里包含I、P、B帧等
  1. 编码:压缩冗余分类。所谓编码算法,就是寻找规律,构建模型
  • 空间冗余
  • 时间冗余
  • 图像构造冗余
  • 视觉冗余
  • 其他
  • 对I帧的处理,是采用帧内编码方式,只利用本帧图像内的空间相关性。
  • 对P帧的处理,采用帧间编码(前向运动估计),同时利用空间和时间上的相关性。简单来说,采用运动补偿(motion compensation)算法来去掉冗余信息。
  1. 编码器性能关注的指标
  • 编码耗时
  • 编码效率
  • 采集帧率、编码后帧率、输入帧率
  1. 自研RTC项目使用的编码器
  • H.264
  • aac
  1. 音频编码格式
  2. 视频编码格式
  • RGB
  • YUV
  • 像素点
  • 高清视频的编码格式有五种,即H.264、MPEG-4、MPEG-2、WMA-HD以及VC-1
    ![在这里插入图片描述](
  1. 编码器两类问题
  • 没有数据编码的,编码器会主动请求一个IDR帧等,如果返回的不是关键帧,其实还是编不出来。
  • 但有冗余数据,比如编码效率低的手机,编码耗时超过阈值的会将这一帧丢掉。
  • 编码效率低、编码类型不适合导致的花屏、绿屏、编码失真马赛克等
  1. 常见编码损耗
  • 有损编码 VS无损编码
  • 帧内编码与帧间编码
  • 对称编码和不对称编码
  1. 编码标准

# 底层顺序

  1. 分区
  • 是将帧分成几个分区,子分区甚至更多,I 切片,B 切片,I 宏块等
  • 编解码器将这些分区组织成切片(slices )或条带(tiles),宏(或编码树单元)和许多子分区
  • HEVC 设置成 64x64,而 AVC 使用 16x16,但子分区可以达到 4x4 的大小
  1. 预测
  • 对于帧间预测,我们需要发送运动向量和残差
  • 对于帧内预测,我们需要发送预测方向和残差
  1. 转换
  • 重点关注离散余弦变换(DCT)。DCT 的主要功能有:
  • 将像素块转换为相同大小的频率系数块
  • 压缩能量,更容易消除空间冗余
  • 可逆的,也意味着你可以还原回像素
  • 我们将使用 DCT 把原始图像转换为频率(系数块),然后丢掉最不重要的系数。
  1. 量化
  • 当我们丢弃一些系数时,在最后一步(变换),我们做了一些形式的量化。这一步,我们选择性地剔除信息(有损部分)或者简单来说,我们将量化系数以实现压缩。
  • 量化矩阵
  1. 商编码
  • 在我们量化数据(图像块/切片/帧)之后,我们仍然可以以无损的方式来压缩它
  • VLC编码
  • 算术编码
  1. 比特流格式
  • 完成所有这些步之后,我们需要将压缩过的帧和内容打包进去。
  • 需要明确告知解码器编码定义,如颜色深度,颜色空间,分辨率,预测信息(运动向量,帧内预测方向),配置*,层级*,帧率,帧类型,帧号等等更多信息