H264 编码过程

news/2025/3/12 12:23:50/

H264应用于视频压缩。

假如正在播放一个1920*1080分辨率的视频,帧率是10帧,如果没有经过压缩,那么一秒产生数据为1920*1080*10/1024/1024=19.77MB,那么这些数据无法接受的,所以需要把数据进行压缩。

下图看出通过编码呈现的数据

在这里插入图片描述

H264相关概念

1.在H264结构中,一个视频图像编码后数据叫做一帧,一帧由一个片或者多个片组成,一片由一个或者多个宏块(MB)组成,宏块由16*16 YUV数据组成。所以宏块是H264编码基本单元。

2.H264采用帧内压缩和帧间压缩方式提高编码率

3.H264采用独特I帧,P帧和B帧策略来实现,连续之间的压缩。

I帧

1.I帧是帧内编码帧,I帧表示关键帧,保存一帧完整的画面。

2.I帧特点:

 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
解码时仅用I帧的数据就可重构完整图像;
I帧描述了图像背景和运动主体的详情;
I帧不需要参考其他画面而生成;
I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
I帧不需要考虑运动矢量;
I帧所占数据的信息量比较大。
 

P帧:

1.P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
2.P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
3.P帧特点:
1.P帧是I帧后面相隔1~2帧的编码帧;
2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
6.由于P帧是参考帧,它可能造成解码错误的扩散;
7.由于是差值传送,P帧的压缩比较高
 

B帧

  1. B帧特点
    1. B帧是由前面的I或P帧和后面的P帧来进行预测的;
    2. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
    3. B帧是双向预测编码帧;
    4. B帧压缩比最高,因为它只反映两个参考帧间运动主体的变化情况,预测比较准确;
    5. B帧不是参考帧,不会造成解码错误的扩散。

3.GOP(画面组)

1.GOP即Group of picture(图像组),指两个I帧之间的距离(下图所说的视频序列就是GOP),Reference(参考周期)指两个P帧之间的距离,可以理解为跟序列差不多意思,就是一段时间内变化不大的图像集,比较说GOP为120,如果是720 p60 的话,那就是2s一次I帧。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。所以在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。
2.GOP结构一般有两个数字,如M=3,N=12。M指定I帧和P帧之间的距离,N指定两个I帧之间的距离。上面的M=3,N=12,GOP结构为:IBBPBBPBBPBBI。在一个GOP内I frame解码不依赖任何的其它帧,p frame解码则依赖前面的I frame或P frame,B frame解码依赖前最近的一个I frame或P frame 及其后最近的一个P frame。
 

4. IDR帧(关键帧)

1.IDR(Instantaneous Decoding Refresh)即时解码刷新。 在编码解码中为了方便,将GOP中首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。
2.I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样,例如:

 

在这里插入图片描述

 3.其核⼼作⽤是,是为了解码的重同步,当解码器解码到 IDR 图像时,⽴即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始⼀个新的序列。这样,如果前⼀个序列出现重⼤错误,在这⾥可以获得重新同步的机会。IDR图像之后的图像永远不会使⽤IDR之前的图像的数据来解码。

在这里插入图片描述

 H264学习分析过程

以下教程以海思3518ev300为准测试。首先准备裸码流,分辨率为1920*1080 10帧。

1.首先先分析H264裸码流

1.H264由一个个NALU组成的,他们结构如下图所示

在这里插入图片描述

每个NALU单元包含多个NAL单元组成,每个NAL单元由NAL头和RBSP组成。

 每个NALU由起始码startcode进行分隔,起始码分割有两种:0x000001(3Byte)或者0x00000001  4Byte组成。

H264裸码流分析首先先搜索0x000001和0x00000001,分离出NALU;然后分析NALU各个字段。首先我们先通过excel下面查看H264原始hex数据。

 图中橙色就是每个NALU开始码,也是每个NALU分隔符。

然后绿色67,68,69是NAL头

NAL单元头部是由forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)三个部分组成的,组成如下图所示:

 1、F(forbiden):禁止位,占用NAL头的第一个位,当禁止位值为1时表示语法错误;一般为0
2、NRI:参考级别,占用NAL头的第二到第三个位;值越大,该NAL越重要。
3、Type:Nal单元数据类型,也就是标识该NAL单元的数据类型是哪种,占用NAL头的第四到第8个位,具体NAL type内容如下图所示

 0x67转成二进制为01100111,第一位为0,第二三位为3,代表优先级最高,第4-8位为7,按照上面表格参考为SPS

0x68转成二进制为01101000,第一位为0,第二三位是3,代表优先级最高,第4-8位为8,按照上面表格参考为PPS

0x69转成二进制为01101001,第一位为0,第二三位是3,代表优先级最高,第4-8位为9,按照上面表格参考为RBSP。

RBSP

RBSP由SODB+结尾比特位组成。

SODB: 数据比特串,是编码后的原始数据

RBSP: 原始字节序列载荷,是在原始编码数据后面添加了结尾比特,一个bit“1”和若干个比特“0”,用于字节对齐。

 

 

H264在网络中传输

在UDP或者TCP单次发包过程中,每次MTU为1500字节,所以当单次传输NALU时,有可能数据包大小大于MTU(1500字节),所以要进行切包传输。

分为以下两种情况:

当NALU Size小于MTU时,整个NALU包可以发送

当NALU Size 大于MTU时,需要切包发送。

H264裸码流数据在网络中传输会转成RTP传输格式,格式如下图所示

 RTP = RTP header + H264payload

RTP Header

RTP header是由12个字节组成,具体数据格式如下图所示

 

FU identifier和FU header

 下面我们从wireshark解析一包UDP数据可知,以下是解析出来的数据。

 由下图可以看出,H264 NAL Unit payload数据格式由一个个NALU组成。

 


http://www.ppmy.cn/news/431252.html

相关文章

NX常见快捷键

定向视图 1)【定向视图】快捷 Home 2)【正等测视图】 End3)【俯视图】 Ctrl Alt T 4)【前视图】 Ctrl AltF 5)【右视图】 Ctrl AltR 6)【左视图】 Ctrl AltL 7)【补捉基本视图】 F8 【视图】菜单快捷键 1)【视图】——刷新 F5 2)【视图】——操作——适…

NX后处理

程序起始序列:用来定义程序头的输出的语句,程序头是所有事件之前的 工序起始序列:用于定义操作开始到第一个切削运动之间的事件 刀径:用于定义机床控制事件以及加工运动钻循环等事件 ①机床控制:主要用于定义进给、换刀…

在Jetson Xavier NX上安装torchvision编译报错:fatal error: libavcodec/avcodec.h: No such file or directory

文章目录: 1 问题原因说明2 解决方法 1 问题原因说明 1、尝试安装torchvision 在Jetson NX设备上安装torch的版本是1.6.0版本,对应安装torchvision版本应该为0.7.0版本 但是如果使用: pip3 install torchvision0.7.0 结果没有这个版本&…

nx二次开发c语言,NX二次开发-UFUN API函数编程基础

1.NXOpen C 的函数 函数名称的约定 NX Open C 共有2类名称约定:一个是标准的NX Open C 的函数名称约定;另一个是以前版本的原有的名称约定。 1.标准名称约定 【格式】UF__ 【说明】 (1)UF:User Funciton的简写,表示该函数为NX Open C 函数。 (2):应用或模块的名称缩写。例如…

Jetson Xavier NX 解码性能评测

视频参数: 1080P H264 4096KB 变编码率 1080P H265 4096KB 变编码率 ./multivideo_decode num_files 1 1.h264 H264 --disable-rendering --dbg-level 0 --input-chunks --stats -s 100 1.硬解码: 1)ffmpeg -c:v h264_nvmpi -i /data/home/xingqia…

NVIDIA Jetson Xavier NX安装torch和torchvision

文章目录: 1 安装torch2 安装torchvision2.1 方法一:直接源码安装torchvision2.2 方法二:使用pip3安装torchvision 1 安装torch 1、教程地址 安装torch直接参考官方的教程即可,官方教程地址: Jetson_Zoo教程地址&…

Jetson Xavier NX相关安装

安装jtop sudo apt-get install python3-pip sudo -H pip3 install -U jetson-stats sudo jtop 更换镜像源 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports…

Jetson Xaiver NX相关教程(详细版)

一、参考资料 Jetson nano/NX 部署Yolo v5过程记录 二、相关介绍 三、软件安装 2.1 jetson-stats 2.1.1 相关介绍 jetson-stats是一个开源软件包,用于监测和控制Nvidia Jetson设备的运行状态。 Jetson-stats包含以下工具: jtop jetson_config jetso…