首页 > 其他分享 >H.264编解码 - I/P/B帧详解

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

时间:2024-09-30 12:18:42浏览次数:12  
标签:编解码 H.264 视频 编码 H264 详解 OneFrameBuf 等级

一、概述

在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

标签:编解码,H.264,视频,编码,H264,详解,OneFrameBuf,等级
From: https://blog.csdn.net/yangzhenhui/article/details/142654035

相关文章

  • 大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(已更完)Druid(正在更新…)章节内容上节我们完成了如......
  • java:详解java编译命令和启动命令
    编译命令在Java开发过程中,编译Java源文件(通常以.java为扩展名)是不可或缺的一步。这一步骤是通过javac命令完成的,该命令是Java编译器(JavaCompiler)的命令行工具。编译后的代码会生成字节码文件,这些文件以.class为扩展名,并可在Java虚拟机(JVM)上运行。基本语法......
  • Vue.js组件开发详解
    Vue.js组件开发详解Vue.js是一个用于构建用户界面的渐进式框架,其核心思想是通过数据驱动视图的变化,同时提供了一系列强大的工具来帮助开发者高效地开发复杂的单页应用。在Vue.js中,组件是构建复杂应用的基本单元,通过组件化开发,我们可以将应用拆分成可复用的、独立的模块,......
  • Java内部类详解
    Java内部类详解1.内部类基础在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。1.1.成员内部类成员内部类是......
  • 服务器虚拟化详解
    服务器虚拟化详解服务器虚拟化是一种将物理服务器资源转化为虚拟服务器资源的技术,它允许在一台物理服务器上运行多个虚拟服务器,每个虚拟服务器都拥有独立的操作系统、应用程序和资源配置。这种技术极大地提高了服务器的利用率、灵活性和可扩展性,成为现代数据中心和云计算环......
  • 一文详解:跨国医疗机构安全合规文件流转的跨境传输解决办法
    跨国医疗机构是指那些能够在不同国家之间提供医疗服务的机构,它们通常具有国际化的医疗网络、专业的医疗团队和先进的医疗设备。这些机构不仅能够帮助患者获取国外优质的医疗资源,还能提供包括医疗咨询、治疗安排、病历翻译、签证办理、海外陪同等在内的全方位服务。跨国医疗机构......
  • 多态详解
    多态多态的概念1.多态概念:一个事物具有多种表现形态。2.在Java程序中,多态表现为定义一个方法,在不同环境下呈现不同的业务逻辑。多态的具体表现一、方法的多态方法的重载和重写均体现多态在Java中,方法的重载(Overloading)和重写(Overriding)确实是多态的两种体现方式,但它们各自......
  • python字符串方法详解
    str1='Hello'str2='World'str3='abc'#字符串拼接print(str1+str2)#HelloWorldprint(''.join([str1,str2]))#HelloWorld#获取字符串切片print(str1[0:4])#Hell获取字符串从索引0开始,到3print(str2[1:3])#or获取字符串从索引1开始,到2print((str1......
  • RTE 大会报名丨智能编解码和 AI 生成视频 ,RTE2024 技术专场第五弹!
       AI视频的爆炸增长,给新一代编解码技术提出了什么新挑战? 语音AI实现human-like的最后一步是什么? 当大模型进化到实时多模态,又将诞生什么样的新场景和玩法? 所有AIInfra都在探寻规格和性能的最佳平衡,如何构建高可用的云边端协同架构? AI加持下,空间计算......
  • 虚假唤醒(Spurious Wakeup)详解:从概念到实践
    你有没有想过,在复杂的多线程编程世界中,有一种看不见却极具破坏力的“幽灵”悄然潜伏?它们不会发出任何警告,却能在你最不经意的时候打乱程序的节奏。这些“幽灵”就是我们今天要讨论的主题:虚假唤醒(SpuriousWakeup)。听起来有点玄乎,但别担心,今天我们将深入浅出地揭开它的神秘面......