H264H265格式

article/2025/9/25 11:45:16

文章目录

      • H264
        • 1. NALU
          • 1.1 NALU Header
            • 1.1.1 nal_unit_type
        • 2. 码流格式
          • 2.1 Annex B格式
          • 2.2 AVCC格式
            • 2.2.1 extradata结构
          • 2.3 H264 Annexb与AVCC格式转换
        • 3. 视频编码帧
          • 3.1 压缩方式
          • 3.2 编码帧
          • 3.3 丢帧
        • 4. PTS与DTS
          • 4.1 概念
          • 4.2 为什么需要PTS,DTS?
      • H265
        • 1.NALU
          • 1.1 Nalu Header
            • 1.1.1 nal_unit_type

H264

1. NALU

H264码流可以分为两层,NAL层(网络抽象层)VCL层(视频编码层)

VCL层负责有效表示视频数据的内容,而NAL层则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。

构成H264码流的基本单位是NAL单元,NAL单元简称为NALU,它包含一个字节的头信息(NALU Header) 和 **原始字节序列载荷(RBSP)**的字节流。

NALU结构如图:

在这里插入图片描述

1.1 NALU Header

以H264的NALU Header为例

NALU头由一个字节组成,它的语法如下:

字段大小含义
F1bitforbidden_zero_bit,H264定义此位必须为0
NRI2bitnal_ref_idc,0~3,标识这个NALU的重要性(3最高)
Type5bitnal_unit_type,NALU的类型

NALU Header分为3个部分:

  • forbidden_zero_bit:禁止位,必须为0。
  • nal_ref_idc:用来表示当前NALU的优先级,数值越大优先级越高。如00的NALU解码器可以丢弃它而不影响图像的显示,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片(Slice),序列参数集(SPS),或是图像参数集(PPS)这些重要的单位时,nal_ref_idc必需大于0。
  • nal_unit_type :表示NALU类型。
1.1.1 nal_unit_type
nal_unit_type数值含义
0未使用
1不分区,非IDR图像的Slice
2片分区A
3片分区B
4片分区C
5IRD图像的Slice(IDR)
6补充增强信息单元(SEI)
7序列参数集(SPS)
8图像参数集(PPS)
9分隔符
10序列结束
11码流结束
12填充
13~23保留
24~25STAP-A/STAP-B 单一时间的组合包
26~27MTAP16/MTAP24 多个时间的组合包
28~29FU-A/FU-B 分片的单元
30~31没有定义

nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。此外1~12由H.264使用,24~31由H.264以外的应用使用。

 

2. 码流格式

一个NALU包中的数据并不包含它的大小(长度)信息,因此不能简单的连接NALU包来建立一个流,因为你不知道一个包从哪里结束,另一个包从哪里开始。

H264有两种码流格式解决上述问题:

  • Annex B格式
  • AVCC格式
2.1 Annex B格式

以起始码(0x00000001)作为H264/H265作为NALU边界。用起始码定位NALU边界存在一个问题,即NALU中可能存在与起始码相同的数据,这里引入防竞争字节。

防竞争字节:为了使NALU主体中不包括与开始码相冲突的,在编码时,就插入一个字节的0x03;解码时将0x03去掉。

如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:
0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303

解码器检测到0x000003时,把03抛弃,恢复原始数据。

2.2 AVCC格式

使用NALU长度,固定字节,通常为4字节,分隔NALU;一般在每个NALU头部为4字节大端格式的长度字节,在一组GOP的头部包含extradata结构,用于存储sequence-header、SPS、PPS数据。

虽然AVCC格式不使用起始码,防竞争字节仍然存在。

2.2.1 extradata结构
namelengthcommnet
version8bit0x01
avc profile8bit0x64
avc compatibility8bit0x00
avc level8bit0x0A
NALULengthSizeMinusOne8bit0xFF,高6位保留,默认为1,低2位为11,表示NALU长度用3+1=4字节表示
number of SPS NALUs8bit0xE1,高3位保留,低5位表示有几个SPS,通常只有1个SPS
SPS size16bit大端格式的SPS长度,0x0019,表示25字节SPS
SPS NALU dataSPS size × 8bit0x67到0x80,表示SPS数据
number of PPS NALUs8bit0x01PPS个数,通常只有1个PPS
PPS size8bit0x07,表示PPS的数据长度
PPS NALU dataPPS size × 8bit0x68到0x30,表示PPS数据

NALULengthSizeMinusOne:用几个字节来存储NALU的长度,默认为3,表示使用4字节表示NALU长度。

2.3 H264 Annexb与AVCC格式转换

H264 Annexb转为AVCC

  • 1、对于一个GOP的开始,根据start-code,分离出SPS、PPS帧,并分别计算出长度
  • 2、根据SPS, PPS创建出extradata,附加到GOP的头部
  • 3、从IDR帧开始,搜索start-code,分离出每一个NALU,计算长度,然后将start-code转为4字节的NALU长度

AVCC 转为 H264 Annexb

  • 1、对于一个GOP的开始,首先检索出extradata部分的数据
  • 2、根据extradata数据创建出SPS帧,并用4字节的start-code:0x00000001附加在SPS数据的头部
  • 3、根据extradata数据创建出PPS帧,并用4字节的start-code:0x00000001附加在PPS数据的头部,并将PPS数据连接到SPS后面
  • 4、根据NALU的长度字段,分离出每一个NALU,然后用用4字节的start-code:0x00000001替换长度字段
  • 5、在以上过程中需要计算每一个NALU的长度,尤其是GOP的IDR帧,一般在IDR帧前还有SPS与PPS帧,其长度需要一起计算

 

3. 视频编码帧

3.1 压缩方式

帧内压缩与帧间压缩

  • 帧内压缩(I帧,JPEG的压缩算法)
  • 帧间压缩( P帧与B帧的压缩算法)

有损压缩与无损压缩

  • 有损压缩: 解压缩后的数据与压缩前的数据不一致.在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复
  • 无损压缩: 压缩前和解压缩后的数据完全一致.优化数据的排列等
3.2 编码帧

常见的H264的编码帧有四种:

  • I帧(关键帧)
  • IDR帧(即时刷新帧)
  • P帧(前向预测参考帧)
  • B帧(双向预测参考帧)

I帧

I帧是帧内编码帧,I帧又称关键帧。

特点:

  • I帧不需要参考P帧/B帧生成一个完整图像。
  • I帧是P帧和B帧的参考帧。
  • I帧通常是每个GOP的第一个帧,采用的帧内压缩,经过适度压缩,作为随机访问的参考点。

IDR帧

IDR为即时解码刷新帧,I帧和IDR帧都是使用帧内预测编码,IDR帧是I帧,但I帧不一定是IDR帧。

I帧(非IDR帧)和IDR帧,只有IDR帧才有SPS和PPS。当解码器收到IDR帧时,将参考帧队列清空;而收到I帧(非IDR帧)不会清空参考帧队列。也就是说,对某个IDR帧之后的帧,解码器不会参考这个IDR帧之前的任何帧做解码。对某个I帧(非IDR帧)之后的帧,解码器可能会参考这个I帧之前的帧做解码。

P帧

P帧是前向预测编码帧,以I帧为参考帧。

它存储与前面的I帧/P帧的预测误差及运动矢量。

特点:

  • P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
  • P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
  • 由于P帧是参考帧,它可能造成解码错误的扩散。
  • P帧的压缩率比I帧要高。

B帧

B帧是双向预测内插编码帧,以前面的I/P帧和后面的P帧为参考帧。B帧存储的是它与前面的I/P帧,和后面的P帧之间的预测误差及运动矢量。

特点:

  • B帧压缩比最高。因为它只反映前后两个参考帧间运动主体的变化情况,预测比较准确。
  • B帧不是参考帧,不会造成解码错误的扩散 。

I帧,B帧,P帧之间的关系:

img

3.3 丢帧

播放器变速中如何丢帧?

  • GOP间的丢帧,只播放关键帧,也就是seek操作。
  • GOP内的丢帧,需要先解码后丢帧播放。
  • 非参考帧的丢帧处理。

针对非参考帧的丢帧处理:

方式:可以判断它的 nal_ref_idc 值来决定是否要丢弃。如果为 0 ,说明其他帧不需要参考该帧,可以直接丢弃不发送给解码器,而不是解码后再丢帧

nalu typenalu header val重要性可否丢帧
SPS0x67(0 11 00111)非常重要不可丢帧
PPS0x68(0 11 01000)非常重要不可丢帧
IDR帧0x65(0 11 00101)非常重要不可丢帧
I帧0x61(0 11 00001)非常重要不可丢帧
P帧0x61(0 10 00001)重要可丢帧,但后面同GOP组内的P帧,B帧都要丢
B帧0x01(0 00 00001)不重要可丢帧
SEI0x06(0 00 00110)不重要可丢帧

参考链接:

​ https://www.cnblogs.com/hankfu/p/13968625.html
​ https://www.sohu.com/a/432293002_465219
​ https://cloud.tencent.com/developer/article/1619203
​ https://blog.csdn.net/u010925568/article/details/75040492

 

4. PTS与DTS

4.1 概念

DTS是解码时间戳,表示解码器应该什么时候解码数据帧。

PTS是显示时间戳,表示渲染器应该什么时候渲染显示数据帧。

一般来说,数据帧经过解码之后,就立即用于渲染显示,为什么还需要两个时间戳?

PTS与DTS是对于视频而言,音频只是一个时间戳DTS,也就是音频帧经过解码就立即播放。对于视频,当视频只有I帧和P帧,PTS和DTS是相同的,只有视频有B帧,PTS与DTS才有可能不一样。

4.2 为什么需要PTS,DTS?

以一个例子说明:

在这里插入图片描述

  1. 视频采集到的一组数据帧,经过传输解码,最终播放顺序按照:

​ I(1) -> B(2) -> B(3) -> P(4) -> B(5) -> B(6) -> P(7)

​ PTS: I(1) < B(2) < B(3) < P(4) < B(5) < B(6) < P(7)

​ 同时也知道采集顺序和显示顺序是一致的

  1. 由于B帧的存在,B帧是前后双向预测帧,必须先缓存并解码其前后两个参考帧才能解码B帧,如B(2),B(3)要解码,必须先缓存解码I(1)和P(4)才行,由此可知:

​ DTS:I(1) < P(4) < B(2) < B(3)

依此类推得出:

​ DTS:I(1) < P(4) < B(2) < B(3) < P(7) < B(5) < B(6)

可看出由于B帧的存在,视频帧的DTS和PTS可能不同

​ 采集到原始视频帧经过编码后得到编码帧,就会被传输,播放端接收到编码帧就进行解码,所以编码顺序、传输顺序和解码顺序是一致的

 

H265

1.NALU

H265的NALU结构和H264是一致的,都是Nalu Header + RBSP的结构。

1.1 Nalu Header

Nalu Header由两个字节组成:

字段大小含义
forbidden_zero_bit1bit禁止位,用以检查传输过程中是否发生错误,0表示正常,1表示违反语法
nal_unit_type6bit用来指示NALU类型
nuh_reserved_zero_6bits6bit预留位,要求为0
nuh_temporal_id_plus13bit表示NALU所在的时间层ID
1.1.1 nal_unit_type

来保存视频流的编解码参数,其格式定义如下:

nal_unit_typeNALU类型备注
0NAL_UNIT_CODE_SLICE_TRAIL_N非关键帧
1NAL_UNIT_CODED_SLICE_TRAIL_R
2NAL_UNIT_CODED_SLICE_TSA_N
3NAL_UINT_CODED_SLICE_TSA_R
4NAL_UINT_CODED_SLICE_STSA_N
5NAL_UINT_CODED_SLICE_STSA_R
6NAL_UNIT_CODED_SLICE_RADL_N
7NAL_UNIT_CODED_SLICE_RADL_R
8NAL_UNIT_CODED_SLICE_RASL_N
9NAL_UNIT_CODE_SLICE_RASL_R
10 ~ 15NAL_UNIT_RESERVED_X保留
16NAL_UNIT_CODED_SLICE_BLA_W_LP关键帧
17NAL_UNIT_CODE_SLICE_BLA_W_RADL
18NAL_UNIT_CODE_SLICE_BLA_N_LP
19NAL_UNIT_CODE_SLICE_IDR_W_RADL
20NAL_UNIT_CODE_SLICE_IDR_N_LP
21NAL_UNIT_CODE_SLICE_CRA
22NAL_RSV_IRAP_VCL22
23NAL_RSV_IRAP_VCL23
24 ~ 31NAL_UNIT_RESERVED_X保留
32NAL_UNIT_VPSVPS(Video Paramater Set)
33NAL_UNIT_SPSSPS
34NAL_UNIT_PPSPPS
35NAL_UNIT_ACCESS_UNIT_DELIMITER
36NAL_UNIT_EOS
37NAL_UNIT_EOB
38NAL_UNIT_FILLER_DATA
39NAL_UNIT_SEI_PREFIXPrefix SEI
40NAL_UNIT_SEI_SUFFIXSuffix SEI
41 ~ 47NAL_UNIT_RESERVED_X保留
48 ~ 63NAL_UNIT_UNSPECIFIED_X未规定
64NAL_UNIT_INVALID
  • NAL_AUD(35),NAL_SEI_PREFIX(39),NAL_SEI_SUFFIX(40)为可丢弃的视频帧。
  • nalu_type:0 ~ 23(不包含保留的nalu_type)用于解码的视频帧。

http://chatgpt.dhexx.cn/article/OamLCcZ4.shtml

相关文章

音视频——视频流H264编码格式

1 H264介绍 我们了解了什么是宏快&#xff0c;宏快作为压缩视频的最小的一部分&#xff0c;需要被组织&#xff0c;然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用宏快来发送数据是杂乱无章的&#xff0c;就好像在没有集装箱 出现之前&#xff0c;…

H264编码简介

H264编码简介 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&#xff08;JVT&#xff0c;Joint Video Team&#xff09;提出的高度压缩…

H264格式

原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494 名词解释 场和帧 &#xff1a; 视频的一场或一帧可用来产生一个编码图像。在电视中&#xff0c;为减少大面积闪烁现象&#xff0c;把一帧分成两个隔行的场。 片&#xff1a; 每个图象中…

H264格式解析

H264码流有两种形式&#xff1a;Annex B和AVCC。这两种码流形式所对应不同的编码方式和格式解析。 Annex B中每个NALU中没有存储NALU长度字节 AVCC中每个NALU中存储了长度信息 H264编码分为两层&#xff1a;vcl和nal vcl&#xff1a;编码nal&#xff1a;网络传输 Annex B的编…

H264编码基础概念+格式分析

一、编码基础概念 1、为什么要进行视频编码&#xff1f; 视频是由一帧帧图像组成&#xff0c;就如常见的gif图片&#xff0c;如果打开一张gif图片&#xff0c;可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿&#xff0c;一秒钟至少需要16帧画面&#xff08…

H264编码格式--图文解释

一、H264格式 RBSP SODB RBSP trailing bits NALU NAL header(1 byte) RBSP H.264 Start Code Prefix(3 bytes) NALU Start Code Prefix(3 bytes) NALU … H.264从层次来看分为两层&#xff1a;视频编码层&#xff08;VCL&#xff0c; Video Coding Layer&#xf…

【音视频基础】H264格式分析

介绍 H264是基于运动补偿的视频编码标准。所谓编码我的理解就是对数据进行压缩便于网络传输。而视频编码就是依据图像帧的像素块之间的相似性对图像进行压缩。 相关概念 H264结构中&#xff0c;一幅图像编码后的数据叫一帧&#xff0c;一帧由一个或多个Slice片组成&#xff…

h264粗略理解

奔着学习的态度&#xff0c;借此试用期要输出文档&#xff0c;把h264的格式和相关知识深入梳理一下。 流媒体分析工具&#xff1a;Elecard StreamEye 一、h264认识 h264是一种视频编码标准&#xff0c;跟常见的视频格式不属于同一类。H.264同时也是MPEG-4第10部分规范(ISO/IEC…

H264简介

H.264是国际标准化组织&#xff08;ISO&#xff09;和国际电信联盟&#xff08;ITU&#xff09;共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG&#xff08;视频编码专家组&#xff09;和ISO…

阿里云单位网站备案承诺书填写(单位/个人)

阿里云单位网站备案承诺书填写 第一个填写「阿里云计算有限公司」 第二个填写公司所在省份/直辖市「深圳市」

个人网站备案很麻烦

看到这么多网站备案的是材料&#xff0c;我放弃了。怪不得大家都往国外跑。 租个香港&#xff08;比如www.smartvps.cn&#xff09;或则美国的亚马逊都可以&#xff0c;免了备案的麻烦。 弄个香港的虚拟主机配了下&#xff0c;没有问题。 搭建指南&#xff1a; http://blog.cs…

wordpress 搭建的博客: 增加网站备案信息

问题描述 使用阿里云的主机&#xff0c;搭建了一个基于wordpress的博客&#xff0c;因为注册的域名是.com&#xff0c;需要网站开启后&#xff0c;增加网站备案的信息搭建好 wordpress 博客后&#xff0c;发现没有地方配置【网站备案信息】 主题 我使用的是 wordpress 的一个…

个人备案的网站能放企业服务器吗,个人及企业域名备案对网站有什么影响

工信部规定&#xff0c;如果想使用中国境内的服务器建站&#xff0c;必须将网站域名进行备案。理论上说&#xff0c;域名备案制度可以在某种程度上减少违法网站的数量。但是那些一心想干坏事的互联网人总会找到各种空子来逃避这个备案制度。所以&#xff0c;个人感觉这个制度是…

在网站底部附上网站备案号

前置条件 备案号已申请通过。本文举例的网站是在腾讯云申请的服务器和域名&#xff0c;管局备案成功后&#xff0c;在全国互联网安全管理服务平台http://www.beian.gov.cn成功备案的。 步骤一 全国互联网安全管理服务平台http://www.beian.gov.cn 你的对应备案联网信息地址为…

【服务器搭建个人网站】教程六:网站如何添加备案号?

前言 哈喽&#xff0c;大家好&#xff0c;我是木易巷&#xff01; 上一篇服务器搭建教程是给大家介绍了&#xff1a;关于域名公安备案的具体流程 今天分享在域名备案审核通过后&#xff0c;网站如何添加备案号&#xff1f; 为什么要在网站添加备案号&#xff1f; 根据工信部…

个人备案网站不能做博客了?

2020年3月1日开始执行了新的《网络信息内容生态治理规定》&#xff0c;作为自媒体的者想必都看到了&#xff0c;为了避免误伤&#xff0c;必须要遵守的。其实在&#xff0c;2019年底&#xff0c;还有一条对个人备案网站的规定&#xff0c;那就是个人备案的网站不能做博客了。 …

个人网站 域名 购买 解析 备案

这里写自定义目录标题 域名购买域名解析备案合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少…

阿里云个人网站备案流程

因为发现阿里云有提供免费两年(2015年)的虚拟主机服务&#xff0c;一直有做个个人网站的想法&#xff0c;所以就去注册申请了一个&#xff0c;原本以为申请好了就可以直接做网站&#xff0c;没想到还要做好多准备工作&#xff0c;拖拉了一个多月&#xff0c;才整好网站雏形&…

个人网站备案承诺书模板(阿里云)

我照片上传后&#xff0c;客服打电话通知—— 必须是打印出来 签名与身份证必须手写 个人网站备案承诺书 本人通过 阿里云计算有限公司 (填写ISP/IDC增值电信业务经营许可证上的名称)向住所所在地 广东省 通信管理局中请网站备案业务&#xff0c;并就此…

个人网站备案时ICP备案的网站建设方案书怎么写?

个人网站备案ICP备案网站建设方案书怎么写&#xff1f; 我们在进行个人网站的ICP备案的时候&#xff0c; 很可能会因为你没有写网站建设备案书而被驳回&#xff0c; 我在百度上找了一圈&#xff0c;基本上没有看见相应的模板 我就把我写的这份分享出来&#xff0c;做一个参…