H.264编解码 - I/P/B帧详解

一、概述

在H.264编解码中,I/P/B帧是一种常见的帧类型。以下是它们的解释:

  1. I帧(关键帧):也称为关键帧,它是视频序列中的第一个帧或每个关键时刻的第一个帧。I帧是完整的、自包含的图像帧,不依赖于其他帧进行解码。它存储了关键时刻的完整图像信息。

  2. P帧(预测帧):P帧是依赖于之前的关键帧或P帧进行解码的帧。它通过对前向预测(predictive coding)的运用,仅存储了当前帧与之前帧之间的差异信息,以减小视频序列的存储空间。

  3. B帧(双向预测帧):B帧是依赖于之前的关键帧、P帧和未来的P帧进行解码的帧。它同时对前后帧进行预测,从而更进一步提供了数据冗余的压缩。B帧在编码过程中使用的是双向预测(bidirectional predictive coding)。

这三种帧类型的使用有助于在H.264编码中实现更高的压缩比和更好的视频质量。I帧提供了关键时刻的完整图像信息,而P帧和B帧则利用前后帧的差异信息进行数据压缩。通过使用这些帧类型的组合,H.264编码器可以在减小存储空间的同时保持视频质量。

二、H.264编码的编码等级

H.264编码定义了不同的编码等级(encoding profiles),每个等级对应不同的编码功能和限制。以下是常见的H.264编码等级:

  1. Baseline(基本编码等级):该等级提供了最基本的H.264编码功能,支持I帧和P帧编码,不支持B帧编码。Baseline等级适用于低带宽和低延迟的应用,如视频会议。

  2. Main(主要编码等级):Main等级是在Baseline等级的基础上增加了对B帧编码的支持。它适用于更高质量和更高压缩比的视频应用,如广播和流媒体。

  3. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值