一、概述
在H.264编解码中,I/P/B帧是一种常见的帧类型。以下是它们的解释:
-
I帧(关键帧):也称为关键帧,它是视频序列中的第一个帧或每个关键时刻的第一个帧。I帧是完整的、自包含的图像帧,不依赖于其他帧进行解码。它存储了关键时刻的完整图像信息。
-
P帧(预测帧):P帧是依赖于之前的关键帧或P帧进行解码的帧。它通过对前向预测(predictive coding)的运用,仅存储了当前帧与之前帧之间的差异信息,以减小视频序列的存储空间。
-
B帧(双向预测帧):B帧是依赖于之前的关键帧、P帧和未来的P帧进行解码的帧。它同时对前后帧进行预测,从而更进一步提供了数据冗余的压缩。B帧在编码过程中使用的是双向预测(bidirectional predictive coding)。
这三种帧类型的使用有助于在H.264编码中实现更高的压缩比和更好的视频质量。I帧提供了关键时刻的完整图像信息,而P帧和B帧则利用前后帧的差异信息进行数据压缩。通过使用这些帧类型的组合,H.264编码器可以在减小存储空间的同时保持视频质量。
二、H.264编码的编码等级
H.264编码定义了不同的编码等级(encoding profiles),每个等级对应不同的编码功能和限制。以下是常见的H.264编码等级:
-
Baseline(基本编码等级):该等级提供了最基本的H.264编码功能,支持I帧和P帧编码,不支持B帧编码。Baseline等级适用于低带宽和低延迟的应用,如视频会议。
-
Main(主要编码等级):Main等级是在Baseline等级的基础上增加了对B帧编码的支持。它适用于更高质量和更高压缩比的视频应用,如广播和流媒体。
-
High(高级编码等级):High等级进一步增加了对更高级别的编码功能的支持,包括8x8 DCT变换和8x8帧内预测。这个等级适用于更高质量和更高压缩比的视频应用,如高清视频和蓝光光盘。
除了这些常见的编码等级外,H.264还定义了其他更特定的编码等级,如Extended(扩展编码等级),High 10(10位编码等级)和High 4:2:2(4:2:2采样编码等级)。这些编码等级提供了更高级别的功能和更高质量的编码,但可能需要更高的计算资源和存储空间。
选择适当的编码等级取决于具体应用的要求,例如带宽、存储空间和视频质量需求。
三、编码等级和I/P/B帧之间的关系
编码等级决定了编码器能够使用的帧类型。较低的编码等级(如Baseline)可能只支持I帧和P帧,而较高的编码等级(如High)则支持I帧、P帧和B帧。使用B帧可以进一步提高压缩效率,但同时也增加了解码的复杂性和延迟。
四、如何判断NALU的类型
在H.264视频编码中,NAL单元(Network Abstraction Layer Unit)是基本的数据单元,用于传输和存储视频数据。常见的NAL单元类型包括SPS(Sequence Parameter Set)、PPS(Picture Parameter Set)、SEI(Supplemental Enhancement Information)和I/P/B帧。
在常用的NAL单元类型中,SPS的类型值为0x07,PPS的类型值为0x08,SEI的类型值为0x06。这些类型值用于标识不同的NAL单元。
而I/P/B帧的类型值为0x01(I帧)、0x05(P帧)和其他值(B帧)。仅仅通过判断NAL单元的类型值无法准确区分I/P/B帧,还需要到具体的slice层去判断。在H.264编码中,每个帧被切分成多个slice,通过分析slice的熵编码内容可以确定帧的类型。
关于熵编码的具体内容,请参考《H.264官方中文版.pdf》。这个文档提供了H.264编码的详细介绍,包括熵编码等技术细节。
下面是ffmpeg中的GetFrameType方法源码:
int GetFrameType(NALU_t * nal)
{
bs_t s;
int frame_type = 0;
unsigned char * OneFrameBuf_H264 = NULL ;
if ((OneFrameBuf_H264 = (unsigned char *)calloc(nal->len + 4,sizeof(unsigned char))) == NULL)
{
printf("Error malloc OneFrameBuf_H264\n");
return getchar();
}
if (nal->startcodeprefix_len == 3)
{
OneFrameBuf_H264[0] = 0x00;
OneFrameBuf_H264[1] = 0x00;
OneFrameBuf_H264[2] = 0x01;
memcpy(OneFrameBuf_H264 + 3,nal->buf,nal->len);
}
else if (nal->startcodeprefix_le
标签:编解码,H.264,视频,编码,H264,详解,OneFrameBuf,等级
From: https://blog.csdn.net/yangzhenhui/article/details/142654035