前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SkeyeARS 视频编码之H.264结构详解

SkeyeARS 视频编码之H.264结构详解

原创
作者头像
Openskeye
发布2023-04-03 09:44:39
3600
发布2023-04-03 09:44:39
举报
文章被收录于专栏:国标视频云平台

1、关于 H.264

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。

这个标准通常被称之为H.264/AVC。

2、H.264 原始码流(即裸流)结构

H264功能分为两层,VCL(视频编码层)和 NAL(网络提取层).

VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。

NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

VCL数据传输或者存储之前,会被映射到一个 NALU 中,H264 数据包含一个个 NALU。如下图

一个原始的 NALU 单元结构如下:

StartCode + NALU Header + NALU Payload 三部分。

StartCode,是一个NALU单元开始,必须是00 00 00 01 或者00 00 01。

其中 NAL Header 格式如下:

代码语言:txt
复制
     0 1 2 3 4 5 6 7 
    +-+-+-+-+-+-+-+-+
    |F|NRI|  TYPE   |  
    +-+-+-+-+-+-+-+-+
  • F(1 bit):Forbidden_zero_bit,禁止位,编码中默认为 0,当网络识别此单元中存在比特错误时,可将其设为 1,以便接收方丢掉该单元。主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。例如对于从无线到有线的网关,一边是无线的非 IP 环境,一边是有线网络的无比特错误的环境。假设一个 NAL 单元达到无线那边时,校验和检测失败,网关可以选择从 NAL 流中去掉这个 NAL 单元,也可以把已知被破坏的 NAL 单元传给接收端。在这种情况下,智能的解码器将尝试重构这个 NAL 单元(已知它可能包含比特错误)。而非智能的解码器将简单的抛弃这个 NAL 单元。
  • NRI(2 bits):Nal_ref_idc,重要性指示位,用于在重构过程中标记一个 NAL 单元的重要性,值越大,越重要。值为 0 表示这个 NAL 单元没有用于预测,因此可被解码器抛弃而不会有错误扩散;值高于 0 表示此 NAL 单元要用于无漂移重构,且值越高,对此 NAL 单元丢失的影响越大。例如,若当前 NAL 属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,该值必须大于 0.
  • TYPE(5 bits): Nalu_type:表示当前 NAL 单元的类型,类型 1-12 是 H.264 定义的,类型 24-31 是用于 H.264 以外的,RTMP 符合规范使用这其中的一些值来定义包聚合和分裂,其他值为 H.264 保留。

nalu_type

表示NALU 类型

0

未指定。

1

未使用Data Partitioning、非IDR图像的Slice。

2

使用Data Partitioning、且为Slice A。

3

使用Data Partitioning、且为Slice B。

4

使用Data Partitioning、且为Slice c。

5

IDR图像中的Slice。

6

补充增强信息单元(SEI)。

7

序列参数集(Sequence Parameter Set, SPS)。

8

图像参数集(Picture Parameter Set, PPS)。

9

分界符。

10

序列结束。

11

码流结束。

12

填充。

13~23

保留。

24~31

未使用。

因此,如果要知道 nalu 的类型,只需要判断 nalu_type 即可:

代码语言:txt
复制
 1 00 00 00 01 06: SEI

 2 00 00 00 01 67: 0x67 & 0x1f = 0x07 : SPS

 3 00 00 00 01 68: 0x68 & 0x1f = 0x08 : PPS

 4 00 00 00 01 65: 0x65 & 0x1f = 0x05 : IDR Slice
  • EBSP:扩展字节序列载荷,在 RBSP 基础上填加了仿校验字节(0x03),它的原因是:在 NALU 加到 Annexb 上时,需要添加每组 NALU 之前的开始码 StartCodePrefix,如果该 NALU 对应的 slice 为一帧的开始(即为 IDR 帧)则用 4 位字节表示:0x00000001,否则用 3 位字节表示:0x000001。为了使 NALU 主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为 0,就插入一个字节的 0x03。解码时将 0x03 去掉。也称为 "脱壳操作"。
  • RBSP:原始字节序列载荷,在 SODB 的后面填加了结尾比特(RBSP trailing bits,一个 bit "1")若干比特 "0",以便字节对齐。
  • SODB:数据比特串,最原始的编码数据。

至此,到了 SODB,就是h264最原始的编码数据。

关于SkeyeARS

SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、关于 H.264
  • 2、H.264 原始码流(即裸流)结构
  • 关于SkeyeARS
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档