H264知识

VideoToolbox基本数据结构:

(1)CVPixelBuffer:编码前和解码后的图像数据结构。

(2)CMTime、CMClock和CMTimebase:时间戳相关。时间以64-bit/32-bit的形式出现。

(3)CMBlockBuffer:编码后,结果图像的数据结构。

(4)CMVideoFormatDescription:图像存储方式,编解码器等格式描述。

(5)CMSampleBuffer:存放编解码前后的视频图像的容器数据结构。


1

视频压缩知识:

H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:

帧内预测压缩,解决的是空域数据冗余问题。

帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。

整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。

CABAC压缩。

经过压缩后的帧分为:I帧,P帧和B帧:

I帧:关键帧,采用帧内压缩技术。

P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。

B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。

除了I/P/B帧外,还有图像序列GOP。

GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:


2

NALU:(H264的码流,H264的实际数据传输)Network Abstract Layer,即网络抽象层

H.264码流在网络中传输时实际是以NALU的形式进行传输的.

H264的码流由NALU单元组成,NALU单元包含视频图像数据和H264的参数信息。其中视频图像数据就是CMBlockBuffer,而H264的参数信息则可以组合成FormatDesc。具体来说参数信息包含SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)


由NALU构成的H264NALUS数据码流

(1)提取sps和pps生成format description。

a,每个NALU的开始码是0x00 00 01,按照开始码定位NALU。

b,通过类型信息找到sps和pps并提取,开始码后第一个byte的后5位,7代表sps,8代表pps。

c,CMVideoFormatDescriptionCreateFromH264ParameterSets函数来构建CMVideoFormatDescriptionRef。具体代码可以见demo。

(2)提取视频图像数据生成CMBlockBuffer。

a,通过开始码,定位到NALU。

b,确定类型为数据后,将开始码替换成NALU的长度信息(4 Bytes)。

c,CMBlockBufferCreateWithMemoryBlock接口构造CMBlockBufferRef。具体代码可以见demo。

(3)根据需要,生成CMTime信息。(实际测试时,加入time信息后,有不稳定的图像,不加入time信息反而没有,需要进一步研究,这里建议不加入time信息)

根据上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可选的时间信息,使用CMSampleBufferCreate接口得到CMSampleBuffer数据这个待解码的原始的数据。见下图的H264数据转换示意图。


1

NALU结构:长度-1byte


NALU结构


NALU Header

NAL header:

forbidden_zero_bit:forbidden_zero_bit shall be equal to 0.

nal_ref_idc:

用于表示当前NALU的重要性,值越大,越重要.

解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU.

nal_ref_idc不等于0时, NAL unit的内容可能是SPS/PPS/参考图像的片等,nal_ref_idc等于0时,NAL unit的内容可能是非参考图像的片等.

SPS/PPS时,nal_ref_idc不可为0,当某个图像的片的nal_ref_id等于0时,该图像的所有片均应等于0.


1

举例来说:

00 00 00 01 06:  SEI信息

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

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

00 00 00 01 65: 0x65&0x1f= 0x05 :IDR Slice

RBSP


2

RBSP 序列举例:


3

SODB与RBSP:

SODB 数据比特串 -> 是编码后的原始数据.

RBSP 原始字节序列载荷 -> 在原始编码数据的后面添加了 结尾比特。一个 bit“1”若干比特“0”,以便字节对齐。


3

NALU架构:


4

1帧 = n个片

1片 = n个宏块

1宏块 =16x16yuv数据

为什么要设置片呢?

设置片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其他片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其他片中。 

可以看到上图中,每个图像中,若干宏块(Macroblock)被排列成片。一个视频图像可编程一个或更多个片,每片包含整数个宏块 (MB),每片至少包含一个宏块。

片有一下五种类型:

片     意义

I       片只包含I宏块

P      片包含P和I宏块

B      片包含B和I宏块

SP     片包含P 和/或 I宏块,用于不同码流之间的切换

SI     片一种特殊类型的编码宏块


SPS:

h264文档 7.2章节描述了内存大小描述语法

7.3.2.1.1描述了sps结构

Sequence Parameter Set(序列参数集)

nal_unit_type = 7

包含H.264的profile_idc和level_idc等信息.

还有图像的宽高:

pic_width_in_mbs_minus1:pic_width_in_mbs_minus1 = 21 以宏块(16x16)为单位的值减1

因此,实际的宽为 (21 + 1) * 16 = 352

pic_height_in_map_units_minus1

PPS:

Picture Parameter Set(图像参数集)

SEI:

Supplementary Enhancement Information


level和profile:

profile:

在H.264的SPS中,第一个字节表示profile_idc,根据profile_idc的值可以确定码流符合哪一种档次。判断规律为:

profile_idc = 66 → baseline profile,基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;

profile_idc = 77 → main profile, 进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少);

profile_idc = 88 → extended profile,主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced), 也支持CAVLC 和CABAC 的支持;

4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

在新版的标准中,还包括了High、High 10、High 4:2:2、High 4:4:4、High 10 Intra、High 4:2:2 Intra、High 4:4:4 Intra、CAVLC 4:4:4 Intra等,每一种都由不同的profile_idc表示。

level:

level由level_idc指定,编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数

Level 主要参数:

1


如何查看H264码流数据?

h264bitstream: https://sourceforge.net/projects/h264bitstream/files/latest/download

H264Naked:https://github.com/shi-yan/H264Naked 可视化工具,H264Naked既可以识别.264,也可以还别.h264.但是使用live555MediaServer播放RTSP流,live555MediaServer只支持.264后缀。

参考文章:https://www.jianshu.com/p/ea650344bafb

如何查看H264裸流数据?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335