一、B 帧 - 双向内插帧
1、B 帧简介
B 帧 全称 " 双向内插帧 ( Bi-directional Predicted Frames ) " , 采用 双向预测编码方式 , 也就是 B 帧 记录的是 本帧 B 帧 与 前后 I 帧 或 P 帧 的差别 ;
粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
注意 : B 帧 需要依赖于其前的最近的一个 I 帧 或者 P 帧 及其后的最近的一个 P 帧 进行解码 , B 帧 不能 依赖与 B 帧 ;
- B 帧 依赖的 前一帧 可以是 I 帧 或者 P 帧 ;
- B 帧 依赖的 后一帧 肯定是 P 帧 , 不可能 是 I 帧 ;
要解码B帧 , 不仅要取得之前的缓存画面 , 还要解码之后的画面 , 通过 前后画面帧 与 本帧 共 3 帧的 数据叠加 取得最终的画面 ;
B 帧 压缩率高 , B 帧 的 压缩 与 解码 对计算机的性能要求较高 ;
2、B 帧解码案例
B 帧解码时 , 需要参考 前后 两帧 数据 ;
下面的 三帧 数据进行解码时 ,
首先 , 解码 I 帧关键帧 ,
然后 , 解码 P 帧 , 根据 I 帧 解码 P 帧 ,
最后 , 解码 B 帧 , 根据 I 帧 和 P 帧 解码 B 帧 ;
二、画面组 Group of Pictures 概念
1、画面组 Group of Pictures 概念
画面组 ( Group of Pictures ) 由 I 帧 / P 帧 / B 帧 组成 ;
- I 帧是 " 内部编码帧 ( Intra Coded Frames ) " , 可以作为随机访问的参考点 , 并且可以被视为一个完整的图像 ; 画面组 的 第一帧 , 必须是 I 帧 ;一个画面组中 , 只有一个 I 帧 ;
- P 帧是 " 前向预测帧 ( Predicted Frames ) " , 记录的是 相对于前一帧 的变化 ;
- B 帧是 " 双向内插帧 ( Bi-directional Predicted Frames ) " , 记录的是 相对于前后帧 的差别 ;
画面组 ( GOP , Group of Pictures ) 的 长度 和 P 帧 / B 帧的数量 等参数 , 对视频压缩效率和图像质量有着重要影响。
画面组 ( GOP , Group of Pictures ) 长度越长 , P 帧 和 B 帧 的数量越多 ,
在实际应用中需要 根据具体需求 和 场景 来选择合适的 GOP 参数 , 以达到最佳的 压缩效果 和 图像质量 ;
2、各类型帧解码错误影响
B 帧 不是参考帧 , 解码错误 不会扩散到其它帧 , 只会影响自己所在的一个帧 ;
I 帧 一旦解码错误 , 会影响到整个 画面组 的 显示 ;
P 帧 解码错误 , 会影响到 后续 P 帧 , 或者依赖该 P 帧 之前 或 之后 的 B 帧 的 画面显示 ;
三、画面组 Group of Pictures 编解码顺序
1、画面组相关的几个次序说明
画面组相关的几个次序说明 : 在下图中有几个相关的顺序 ;
- 解码顺序 : 先解码 I 帧 关键帧 , 再解码 P 帧 , 最后解码 B 帧 ;
- 显示顺序 : 就是帧正常排列的顺序 ;
- DTS : Decoding Time Stamp , 解码时间戳 , 告知播放器该在何时解码这一帧的数据 , 该时间戳是 AVPacket 结构体中的一个成员 , 表示这个压缩包应该何时被解码 ;
- PTS : Presentation Time Stamp , 显示时间戳 , 告诉播放器该在何时显示这一帧的数据 , 该数据决定帧在播放过程中实际显示时间的关键因素 ;
大多数 编解码标准中 ( 如 : H.264 ) , 编码顺序 和 显示顺序 可能并不一致 , 特别是当存在B帧时 ;
此时 DTS 和 PTS 就显得尤为重要 , 这两个时间戳 能够确保音视频数据的正确同步和顺序播放 ;
2、画面组解码次序详细解析
每个 GOP 画面组 都是以 I 帧开始 , 先把 I 帧 解码出来 ;
I 帧 意味着 重新开始 :
- 丢弃数据 : 只要 I 帧 解码出来 , 就可以将前面的 GOP 画面组 抛开 , 丢弃 ; 之前 上一个 画面组 GOP 解码出来的 数据 , 保存的中间数据 , 差异数据 , 关键帧数据 , 可以全部丢弃了 ;
- 新关键帧 : 之后的 数据 都以 这个 I 帧 为基础进行解码 ,
- 错误终止 : 如果前面的 画面组 有解码错误 , 那么从这个 I 帧 开始 , 就不会出错了 ;
画面组 的 第一帧 I 帧 , 解码出来之后 , 就可以把 依赖于 该 I 帧的 前向预测帧 P 帧 , 解码出来 , 这是 第二个 需要解码的帧 ;
在 I 帧 和 P 帧 中间的 两个 B 帧 , 都依赖于 前面的 I 帧 和 后面的 P 帧 ;
- 第二个 B 帧 , 记录的数据是与 第一个 I 帧 和 第四个 P 帧 的 差异数据 ;
- 第三个 B 帧 , 记录的数据是与 第一个 I 帧 和 第四个 P 帧 的 差异数据 ;
两个 B 帧的 前后次序 , 就是 前后次序决定的 ;
如果 解码次序打乱 , 也可以按照 显示时间戳 进行 正确的播放 ;
四、常用视频压缩算法 ( 仅做参考 )
1、MPEG 阵营算法
MPEG 阵营算法 : Moving Picture Experts Group , 制定音视频压缩标准的国际组织 ;
- MPEG-1 算法 : 针对 1.5 Mbps 以下数据传输率的数字存储媒体运动图像及其伴音编码的国际标准 , 应用广泛 , 如 : VCD ;
- MPEG-2 算法 : 提供接近广播级质量的视频输出 , 常用于 DVD / 数字有线电视 领域 ;
- MPEG-4 算法 : 流媒体 高质量视频 算法 , 以对象的压缩方式 提高了压缩效率 , 同时提供了更好的交互性和灵活性 ;
- H264 算法 : 又称为 " AVC 算法 " , 高度压缩数字视频编解码器标准 , 以先进的压缩技术使得在同等图像质量的条件下 , 压缩后的数据量比以前的标准 ; 广泛应用于 网络流媒体 / 视频通话 / 高清电视广播等领域 ;
- H265 算法 : 又称为 " HEVC 算法 " , 提供更高的压缩效率 , 更高分辨率的视频 , 如 4K / 8K ; 可以在维持相同视频质量的同时 , 将视频文件的压缩效率提高一倍 , 这意味着视频文件将减少一半 ;
2、中国阵营算法
中国阵营算法 :
- AVS 算法 : 中国具有自主知识产权的音视频编码技术标准 , 制定数字音视频的压缩、解压缩、处理和表示等共性技术标准 , 为数字音视频设备与系统提供高效经济的编解码技术 ;
3、Google 阵营算法
Google 阵营算法 :
- VP8 算法 : Google 开发的开源视频压缩格式 , 是 WebM 项目的一部分 , 提供高质量的实时视频压缩 , 同时保持较低的解码复杂性 ;
- VP9 算法 : 提供了更高的压缩效率 , 也是 WebM 的一部分 , 用于 网络视频流 和 WebRTC 等应用 ;
粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓