H264格式具体说明

1.1元素分层结构
H.264编码器输出的Bit流中,每一个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构,分别描写叙述各个层次的信息。
图1
H.264分层结构由五层组成,各自是序列參数集、图像參数集、片(Slice)、和宏块和子块。參数集是一个独立的数据单位,不依赖于參数集外的其他句法元素。图2描写叙述了參数集与參数集外的句法元素之间的关系。

图2
一个參数集不正确应某一个特定的图像或序列,同一序列參数集能够被多个图像參数集引用,同理,同一个图像參数集也能够被多个图像引用。仅仅在编码器觉得须要更新參数集的内容时,才会发出新的參数集。
在H.264中,图像以序列为单位进行组织。一个序列的第一个图像叫做IDR图像,IDR图像都是I帧,H.264引入IDR图像为了解码的同步,当解码
器解码到IDR图像时,马上将參考帧队列清空,将已解码的数据所有输出或抛弃,又一次查找參数集,開始一个新的序列。这样,假设前一个序列出现重大错误,在
这里能够获得又一次同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
IDR是I帧,但I帧不一定是IDR。I帧之后的图像有可能会使用I帧之前的图像做运动參考。
1.2描写叙述子
描写叙述子描写叙述从Bit流中取出句法元素的方法。
编号
语法
说明
1
ae(e)
CABAC
2
b(8)
读进连续的8个Bit
3
ce(v)
CAvlc
4
f(n)
读进连续的n个Bit
5
i(n)/i(v)
读进连续的若干Bit,并把它们解释为有符号整数
6
me(v)
映射指数Golomb熵编码
7
se(v)
有符号指数Golomb熵编码
8
te(v)
截断指数Golomb熵编码
9
u(n)/u(v)
读进连续的若干Bit,并把它们解释为无符号整数
10
ue(v)
无符号指数Golomb熵编码
表1
1.3句法的表示方法
句法元素的名称由小写字母和一系列下划线组成,变量名称是大写和小写字母组成,中间没有下划线。
二 句法表
定义了H.264的句法,指明在码流中依次出现的句法元素及它们出现的条件、提取描写叙述子等。句法表是分层嵌套的。
句法表中的C字段表示该句法元素的分类,这是为片区服务,分类的详细含义例如以下表描写叙述。
nal_unit_type
NAL类型
C
0
未使用
1
不分区、非IDR的片
2,3,4
2
片分区A
2
3
片分区B
3
4
版分区C
4
5
IDR图像中的片
2,3
6
补充增强信息单元(SEI)
5
7
序列參数集
0
8
图像參数集
1
9
分界符
6
10
序列结束
7
11
码流结束
8
12
填充
9
13..23
保留
24..31
不保留
表2
2.1 NAL语法
编码器将每一个NAL各自独立、完整地放入一个分组,由于分组都有头部,解码器能够方便地检測出NAL的分界,并依次取出NAL进行解码。
每一个NAL前有一个起始码
0x000001,解码器检測每一个起始码,作为一个NAL的起始标识,当检測到下一个起始码时,当前NAL结束。同一时候H.264规定,当检測到
0x000000时,也能够表征当前NAL的结束。对于NAL中数据出现0x000001或0x000000时,H.264引入了防止竞争机制,假设编码
器检測到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:
0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
解码器检測到0x000003时,把03抛弃,恢复原始数据。
解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再開始解码。
句法
C
Desc
nal_nuit(NumBytesInNALunit){/* NumBytesInNALunit为统计出来的数据长度 */
forbidden_zero_bit /* 等于0 */
All
f(1)
nal_ref_idc/* 当前NAL的优先级,取值范围0-3 */
All
u(2)
nal_unit_type /* NAL类型,见表2描写叙述 */
All
u(5)
NumBytesInRBSP=0
for(i=1;i<NumBytesInNALunit;i++){
if(i+2<NumBytesInNALunit && next_bits(24)==0x000003{
/* 0x000003伪起始码,须要删除0x03这个字节 */
rbsp_byte[NumBytesInRBSP++]
All
b(8)
rbsp_byte[NumBytesInRBSP++]
All
b(8)
i+=2/* 取出前两个0x00后,跳过0x03 */
emulation_prevention_three_byte/* equal to 0x03 */
All
f(8)
}else{
rbsp_byte[NumBytesInRBSP++] /* 继续读取后面的字节 */
All
b(8)
}
}
表3
2.2序列參数集(SPS)
句法
C
Desc
seq_parameter_set_rbsp(){
profile_idc/* 指明所用的Profile */
0
u(8)
constraint_set0_flag
0
u(1)
constraint_set1_flag
0
u(1)
constraint_set1_flag
0
u(1)
reserved_zero_5bits /* equal to 0 */
0
u(5)
level_idc /* 指明所用的Level */
0
u(8)
seq_parameter_set_id /* 指明本序列參数集的id号,0-31,被图像集引用,编码须要产生新的序列集时,使用新的id,而不是改变原来參数集的内容 */
0
ue(v)
log2_max_frame_num_minus4/*
为读取元素frame_num服务,frame_num标识图像的解码顺序,frame_num的解码函数是ue(v),当中
v=log2_max_frame_num_minus4+4,该元素同一时候指明frame_num的最大值MaxFrameNum=2(
log2_max_frame_num_minus4+4)*/
0
ue(v)
pic_order_cnt_type /* 指明poc的编码方法,poc标识图像的播放顺序,poc能够由frame_num计算,也能够显示传送。poc共三种计算方式 */
0
ue(v)
if(pic_order_cnt_type==0)
log2_max_pic_order_cnt_lsb_minus4 /* 指明变量MaxPicOrderCntLsb的值, MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4) */
0
ue(v)
else if(pic_order_cnt_type==1){
delta_pic_order_always_zero_flag /* 等于1时,元素delta_pic_order_cnt[0]和delta_pic_order_cnt[1]不在片头中出现,而且它们的默认值是0,等于0时,上述两元素出现的片头中 */
0
u(1)
offset_for_non_ref_pic /* 用来计算非參考帧或场的poc,[-231,231-1] */
0
se(v)
offset_for_top_to_bottom_field/* 计算帧的底场的poc */
0
se(v)
num_ref_frames_inpic_order_cnt_cycle /* 用来解码poc,[0.255] */
0
ue(v)
for(i=0;i<num_ref_frames_inpic_order_cnt_cycle;i++)
offset_for_ref_frame[i]/* 用来解码poc,对于循环中的每一个元素指定一个偏移 */
0
se(v)
}
num_ref_frames /* 參考帧队列可达到的最大长度,[0,16] */
0
ue(v)
gaps_in_frame_num_value_allowed_flag /* 为1,同意slice header中的frame_num不连续 */
0
u(1)
pic_width_inmbs_minus1 /* 本元素加1,指明以宏块为单位的图像宽度 PicWidthInMbs=pic_width_in_mbs_minus1+1 */
0
ue(v)
pic_height_in_map_units_minus1 /* 本元素加1,指明以宏块为单位的图像高宽度 PicHeightInMapUnitsMbs=pic_height_in_map_units_minus1+1 */
0
ue(v)
frame_mbs_only_flag /*
等于0表示本序列中全部图像均为帧编码;等于1,表示可能是帧,也可能场或帧场自适应,详细编码方式由其他元素决定。结合前一元
素:FrameHeightInMbs=(2-frame_mbs_only_flag)*PicHeightInMapUnits */
0
ue(v)
if(frame_mbs_only_flag)
mb_adaptiv_frame_field_flag /* 指明本序列是否是帧场自适应模式:
frame_mbs_only_flag=1,所有是帧
frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=0,帧场共存
frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=1,帧场自适应和场共存*/
0
u(1)
direct_8x8_inference_flag /* 用于指明B片的直接和skip模式下的运动矢量的计算方式 */
0
u(1)
frame_cropping_flag /* 解码器是否要将图像裁剪后输出,假设是,后面为裁剪的左右上下的宽度 */
0
u(1)
if(frame_cropping_flag){
frame_crop_left_offset
0
ue(1)
frame_crop_right_offset
0
ue(1)
frame_crop_top_offset
0
ue(1)
frame_crop_bottom_offset
0
ue(1)
}
vui_parameters_present_flag /* 指明vui子结构是否出如今码流中,vui子结构在附录中指明,用于表征视频
格式的信息 */
0
u(1)
if(vui_parameters_present_flag)
vui_parameters()
0
rbsp_trailing_bits()
0
}
表4
H264格式具体说明的更多相关文章
- 树莓派环境下使用python将h264格式的视频转为mp4
个人博客 地址:https://www.wenhaofan.com/a/20190430144809 下载安装MP4Box 命令行下执行以下指令安装MP4Box sudo apt-get inst ...
- H264格式(转)
名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片 : 每个图象中,若干宏块被排列成片的形式.片分为 ...
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
本文转自Holo的博客:http://blog.csdn.net/u013758734/article/details/50834770 最近在研究EasyDarwin的Push库EasyPusher ...
- 多媒体开发之---h264格式slice_header
从Slice_Header学习H.264 写在前面: $ H.264我是结合标准和毕厚杰的书一块学的.看句法语义时最是头疼,一大堆的元素,很需要耐心.标准中在介绍某个元素的语义时,经常会突然冒 ...
- 多媒体开发之---h264格式详解
http://blog.csdn.net/bluebirdssh/article/details/6533501 http://blog.csdn.net/d_l_u_f/article/detail ...
- 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧
前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...
- mp4格式的视频,编码方式mpeg4,转化为h264
知识点:在使用vcastr3.swf播放器播放flv视频,(同时在html5页面,使用<video>标签时),发现某些MP4格式的代码不能播放 原因:vcastr3.swf和video,不 ...
- 嵌入式 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
- 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
随机推荐
- iOS实践03
主要目标:版本新特性界面,新浪授权界面(登录界面)的处理 任务基本完成了,基本的框架也就到这了,接下来的应该是首页获取微博了. 1.版本新特性,可以单独作为一个model,写完之加入到项目中.我们新建 ...
- 关于反射的一个小问题---.NetFrameWork版本不一样导致不同的系统的问题
背景: 近期项目中用到发射,本人的电脑上是安装了.NetFrameWork 4.5,然后用着发射蛮顺溜的,啪啪,三下五除二,项目完成了,然后提交测试了,测试的电脑是虚拟机上安装了xp系统,然后.Net ...
- ASP.NET产生随机验证码
效果图:(Flowing) 1.项目中新建用于存储(位图)图片文件夹 图解: 2.前台可以添加一ASP.NET控件或其他任意用来展示图片标签等(如下) <div> <asp:Imag ...
- C++重载赋值运算符
这是一道C++的面试题,下面在这篇博客中分析一下这个问题.先上题目: //题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: ...
- 使用PHP实现用户登录和注册的功能
登陆界面 login.php <form action="logincheck.php" method="post"> 用户名:<input ...
- ThinkPHP第十四天(显示TRACE界面配置,关联模型详解定义)
1.显示TRACE界面,首选需要在显示模版界面,$this->display(),然后需要在配置文件中配置 SHOW_PAGE_TRACE => true 2.关联模型使用 主表以user ...
- IOS本地化。
1,项目名本地化 点击项目,蓝色图标->info 最下面+号,添加chinese本地化. Supporting Files->infoPlist.strings 下会有两个文件,有一个是设 ...
- squid客户端命令
常用squid客户端命令: squidclient -p mgr:info #取得squid运行状态信息: squidclient -p mgr:mem #取得squid内存使用情况: squidcl ...
- 转:说说angularjs中的$parse和$eval
说说AngularJS中的$parse和$eval AngularJS的初学者常常会对$parse和$eval两个内建服务感到有些困惑,今天我们就来说说AngularJS中的$parse和$eval. ...
- 从51跳cortex-m0学习2——程序详解
跳cortex-m0——思想转变>之后又一入门级文章,在此不敢请老鸟们过目.不过要是老鸟们低头瞅了一眼,发现错误,还请教育之,那更是感激不尽.与Cortex在某些操作方式上的异同,让自己对Cor ...