H264 编码过程

H264 编码过程1 网络抽象层单元类型 NALU NALU 头由一个字节组成 它的语法如下 0 1 2 3 4 5 6 7 F NRI Type F 1 个比特 forbidden zero bit 在 H 264 规范中规定了这一位必须为 0 NRI 2 个比特 nal ref idc 取 00 11

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帧特点:

P帧:

B帧

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

3.GOP(画面组)

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组成。

H264 编码过程

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

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

H264 编码过程

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

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

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

H264 编码过程

H264 编码过程

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

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

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

RBSP

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

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

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

 H264 编码过程

 

H264在网络中传输

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

分为以下两种情况:

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

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

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

H264 编码过程

 RTP = RTP header + H264payload

RTP Header

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

H264 编码过程

 

FU identifier和FU header

H264 编码过程

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

H264 编码过程

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211903.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:19
下一篇 2026年3月18日 下午9:19


相关推荐

  • 正则表达式替换某个字符「建议收藏」

    正则表达式替换某个字符「建议收藏」需要匹配指定位置的某个字符示例:替换时间戳中的最后一个冒号为.号//原始字符串letstr="18:78:45:222"//匹配letreg=/^(.{5,8}):(.*)$/g//替换letresult=str.replace(reg,"$1*$2")希望有更好的方法,看官们留个言呗…

    2022年5月16日
    43
  • netcdf入门

    netcdf入门转载出处 nbsp http blog csdn net laomai 一 概述 nbsp NetCDF 全称为 networkCommo 中文译法为 网络通用数据格式 对程序员来说 它和 zip jpeg bmp 文件格式类似 都是一种文件格式的标准 netcdf 文件开始的目的是用于存储气象科学中的数据 现在已经成为许多数据采集软件的生成文件的格式 nbsp nbsp 从数学上来说 netcdf 存储的

    2026年3月11日
    1
  • Java8与JDK1.8与JDK8与J2SE8与J2SE1.8的区别是什么?——Java的各个版本和各个版本的历史版本号的关系与解读

    Java8与JDK1.8与JDK8与J2SE8与J2SE1.8的区别是什么?——Java的各个版本和各个版本的历史版本号的关系与解读Java8 与 JDK1 8 与 JDK8 的区别是什么 Java 是面向对象的编程语言 在我们开发 Java 应用的程序员的专业术语里 Java 这个单词其实指的是 Java 开发工具 也就是 JavaDevelopm 所以我们常常在 CSDN 等各大程序员论坛讨论到安装 Java8 或者 JDK8 或者 JDK1 8 其实这 3 个专业词汇的概念是一样的 因为在用户眼中 Java 是 Java 应用 而在程序员眼中 Jav

    2026年3月19日
    2
  • expect java,Expect 使用详解「建议收藏」

    expect java,Expect 使用详解「建议收藏」第1章expect概括expect期待expect是Unix系统中用来进行自动化控制和测试的软件工具,由DonLibes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。…

    2025年5月31日
    5
  • VHDL语言简介

    VHDL语言简介一个完整的 VHDL 程序包括实体 Entity 结构体 Architecture 配置 Configuratio 包集合 Package 库 Library 5 个部分 在 VHDL 程序中 实体和结构体这两个基本结构是必须的 他们可以构成最简单的 VHDL 程序 实体声明对设计实体与外部电路的端口描述 以及定义所有输入和输出端口的基本性质 是实体对外的一个通信界面 结构体描述了实体的结构 行为 元件及内部连接关系 即定义了设计实体的功能 规定了实体的数据流程 指定了实体内部的数据连接关系

    2026年3月17日
    2
  • java entryset_Java HashMap entrySet()方法与示例

    java entryset_Java HashMap entrySet()方法与示例HashMap 类 entrySet 方法 HashMapClass method entrySet methodisavai utilpackage entrySet 方法在 java util 包中可用 entrySet methodisused key valuepairs th

    2025年12月14日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号