H264格式解析
在研究视频时发现相邻两帧之间由于时间极为短暂在大多数情况下其像素亮度与色温变化均较为微小因此对每幅图像进行全面编码会造成资源的巨大浪费如果观察到某一时间段内像素变化相对平缓则可以在记录首帧图像后其余各帧只需记录与首帧存在的差异即可达到压缩效果这就是视频压缩中最基础的核心思想
序列(Sequence) 在H.264标准文档中被定义为具有相同尺寸与帧率的一系列连续图像块。通常包含了一个完整视频文件。
GOP (Group of Pictures): 这一在实践应用中常被提及的概念,在视频编码领域具有重要地位。它是由一个基准图像IFrame开头的一组图像组成的集合体,在这一集合体中随后紧跟的是基于该基准图像解码所需的PFrame和/或BFrame(双向预测框架)。每个GOP通常以一个IFrame开始,并伴随后续的一系列依赖于该基准图像进行解码的框架序列。通常情况下,在视频流传输过程中会包含多个这样的GOP结构单元
视频编码中的I型(Intra-coded)图片框:是一种无需依赖前一或后一图片框进行解码处理的独特图像类型。因为它们完全独立于前后图片框的信息,在这一特定阶段就可以直接呈现给观众而无需等待前面所有图片框的完成处理过程。因此在这一特定阶段就可以直接呈现给观众而无需等待前面所有 pictures frames 的完成处理过程;从而省去了对之前所有 pictures frames 进行解码的需求;这种类型的 pictures frames 通常被用作 random access 的关键 point,在诸如快速导航、倒退操作或者直接跳转到 video 的任意位置等场景下具有重要的应用价值
P帧 (预测编码图像帧):基于前缀的I帧或P帧,在运动预测的基础上完成帧间预测编码。
B帧(双向预测编码图像帧):实现最高压缩比,并既依赖之前的I或P型框架(I型或P型框架),也依赖后续的P型框架(在运动预测技术的支持下进行相互之间的双层编码)。
IDR图像 :在某个序列中,默认的第一个图像是其I帧(Immediate Refresh Image),也被定义为该序列的起始画面;这些默认的第一个图像是I帧类型
在编码过程中可能会出现多个连续的I帧段落,在每个GOP单元中通常只包含一个独立解码(I)帧。这种设置有助于维持编码过程中的解码效率与总体压缩效率之间的平衡。
H.264的原始数据流通常由一组aNALUnit(NALU)构成。每个aNALUnit通常包含[start code] + [nalu header] + [nalu payload]三个部分。其中start code通常是两种常见值中的其一:即十六进制数"1"或"2"(即十六进制数"1"或二进制数"1 个字节)。
NALU头信息通常用1个字节来表示,在这个结构中包含一个单独的比特来标识禁止字段,并且未来可能会支持扩展功能。接下来的2到3比特将用于表示重要性字段,在此之后剩余的部分则用于数据类型字段

H.264编码方案通常采用两种封装方式:一种是Annex B封装方案(传统编码方案),其中包含起始码(startcode)、SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)等信息位于编码序列(ES)内;另一种是MP4/AVC格式(另一种常见的视频编码格式),通常用于MP4、MKV文件等场景,在这些文件中这些参数信息被封装到容器头部分块中。每个帧前面的四个字节用于标识该帧的长度。由于许多解码器仅支持Annex B封装方案,在进行视频解码时可能会遇到兼容性问题;因此需要将其他文件类型转换为Annex B格式:例如在FFmpeg工具链中使用h265 Demuxer中的h265_mp9toannexb_filter滤镜即可完成这一转换过程
const AVBitStreamFilter *bsfilter = av_bsf_get_by_name("h264_mp4toannexb");
AVBSFContext *bsf_ctx = NULL;
// 2 初始化过滤器上下⽂
av_bsf_alloc(bsfilter, &bsf_ctx); //AVBSFContext;
// 3 添加解码器属性
avcodec_parameters_copy(bsf_ctx->par_in, ifmt_ctx->streams[videoindex]->cod
ecpar);
av_bsf_init(bsf_ctx);
这篇文章是一条美食博客内容分享平台
