MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS或M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。
区别:
DVD节目中的MPEG2格式,确切地说是MPEG2-PS,全称是Program Stream(程序流),而TS的全称则是Transport Stream(传输流)。MPEG2-PS主要应用于存储的具有固定时长的节目,如DVD电影,可添加字幕等一些程序操作。而MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。
简单地说,将DVD上的VOB文件的前面一截cut掉(或者是数据损坏数据)就会导致整个文件无法解码,而电视节目是任何时候打开电视机都能解码(收看)的。所以MPEG2-TS格式的特点就是从视频流的任一片段开始都是可以独立解码。
(1)ES流(Elementary Stream,基本流):基本码流,不分段的音频、视频或其他信息的连续码流。
(2)PES流(Paketized Elementary Stream,打包基本码流):是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。
(3)PS流(Program Stream,节目流):将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述后的码流。PS流是一种多路复用数字音频、视频等的封装容器,它是一个或多个具有共同的时间基准的PES流合并成一个整体流,主要用于节目存储。其包长不固定,且较长,一旦失去同步信息,接收机无法确定下一包的同步位置,会造成失步,导致严重的信息丢失。PS流适用于误码小、信道较好的环境,如演播室、家庭环境和存储介质中。
(4)TS流(Transport Stream,传输流):是将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述和节目组成信息,并进一步封装成传输包后的码流。TS流是将视频、音频、PSI等数据打包成传输包进行传送。主要用于节目传输。TS的传输包长度固定,一般为188字节。
(5)TS流和PS流是MPEG-2标准中规定的两种输出码流。TS格式中,从视频流的任意一片断开始都可以独立解码,而PS格式不可以。由于TS流具备较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS流的包格式。
(6)TS流的播放:播放前将TS流文件的后缀名改为.mpg或者.mpeg,用可以直接播放MPEG-TS流的播放器(一般的播放器都可以)打开播放即可。
(7)TS流的优点:
① 动态带宽分配:由于TS的传输包长度是固定的,因此可过PID将规定的信道总频带在视频、音频和数据信息进行实时的、灵活的分配。利用这一特性,可在广播付费节目前实时地将解密钥匙插入到TS流中送给广大用户。
② 可分级性:允许一个复用的传输码流与其他视音频基本码流进行二次复用,生产占用频带给宽的更高一级的TS流。
③ 可扩展性
④ 抗干扰性
⑤ 接收机成本低廉
(8)TS流的形成过程:
① 压缩【显示单元】产生【进入单元】,连续的【进入单元】组成一个基本码流。
② 对ES(基本码流)进行打包形成PES。
③ 在PES包中加入定时信息(PTS/DTS)。
④ 将PES包内容分配到一系列固定长度的传输包中。
⑤ 在传输包中加入定时信息(PCR)。
⑥ 在传输包中加入节目专用信息(PSI) 。
⑦ 连续输出传输包形成具有恒定比特率的MPEG-TS流。
下图是在MPEG-2系统中编码端实现单一码流的详细过程:
(1)A/D转换后,通过MPEG-2压缩编码得到ES基本流。该流数据量很大,并且只是I P B帧的取样信息。
(2)通过PES打包器,打包并在每个帧中插入PTS/DTS标识,编程PES。原来是流的格式,现在成了数据包的分割形式。
(3)PES根据需要打包成PS或者TS包进行存储。
MPEG-2中规定TS传输包的长度为188字节。但通信媒介会为包添加错误校验字节,从而有了不同于188字节的包长。例如:
DVB规定中,使用204字节作为包长:① 通过调制器时,在每个传输包后增加了16字节的里德所罗门前向纠错码,因而形成了204字节的数据包。调制后总存在204字节的数据包。② 调制之前存复用器插入RS码或虚构的RS码。
ATSC规定中,使用208字节作为包长:添加20字节的RS(Reed-Solomon)前向纠错码。与DVB不同,ATSC规定RS码只能出现在调制的TS流中。
所有的TS包都分为包头和净荷部分。TS包中可以填入很多东西(填入的东西都是填入到净荷部分),有:视频、音频、数据(包括PSI、SI以及其它任何形式的数据)。
TS流是基于Packet的位流格式,每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据,其他格式一样)。整个TS流组成形式如下:
包头信息分析见1.4.1。TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也为插入当地节目提供方便。自适应区中的填充数据是由于PES包长不可能正好转为TS包的整数倍,最后的TS包保留一小部分有用容量,通过填充字节加以填补,这样可以防止缓存器下溢,保持总码率恒定不变。
TS包的包头提供关于传输方面的信息:同步、有无差错、有无加扰、PCR(节目参考时钟)等标志。TS包的包头长度不固定,前32比特(4个字节)固定,后面可能跟有自适应字段(适配域)。32个比特(4个字节)是最小包头。包头的结构固定如下:
typedef struct TS_packet_header
{
unsigned sync_byte : 8;
unsigned transport_error_indicator : 1;
unsigned payload_unit_start_indicator : 1;
unsigned transport_priority : 1;
unsigned PID : 13;
unsigned transport_scrambling_control : 2;
unsigned adaption_field_control : 2;
unsigned continuity_counter : 4;
} TS_packet_header;
PID是TS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。如果一个TS流中的一个Packet的Packet Header中的PID是0x0000,那么这个Packet的Packet Data就是DVB的PAT表而非其他类型数据(如Video、Audio或其他业务信息)。下表给出了一些表的PID值,这些值是固定的,不允许用于更改。
表 | PID值 |
---|---|
PAT | 0x0000 |
CAT | 0x0001 |
TSDT | 0x0002 |
EIT,ST | 0x0012 |
RST,ST | 0x0013 |
TDT,TOT,ST | 0x0014 |
TS包中净荷所传输的信息包括两种类型:
① 视频、音频的PES包以及辅助数据;
② 节目专用信息PSI。
当然,TS包也可以是空包。空包用来填充TS流,可能在重新进行多路复用时被插入或删除。
在系统复用时,视频、音频的ES流需进行打包形成视频、音频的PES流,辅助数据(如图文电视信息)不需要打成PES包。PES包非定长,音频的PES包小于等于64K,视频的一般为一帧一个PES包。一帧图象的PES包通常要由许多个TS包来传输。MPEG-2中规定,一个PES包必须由整数个TS包来传输。如果承载一个PES包的最后一个TS包没能装满,则用填充字节来填满;当下一个新的PES包形成时,需用新的TS包来开始传输。
(1)PES相关
PES是打包过的ES,已经插入PTS和DTS,一般一个PES是一帧图像。
PES经过打包成TS或PS流,往往一个PES会分存到多个TS包中。
① PES包的包起始码:
包起始码前缀是一个固定的码字结构,它的值是0x000001,用于收发两端对PES包进行同步。
② PES包的长度:
PES包的长度是可变的,PES包长度域有两个字节,共16比特,因此PES包的最大长度是65535字节
③ PES包头:
PES包头的功能根据特定的应用场合有所不同,包括加扰控制,优先级,ES流速率和CRC等,其中有两个重要的工作:PTS和DTS。
可以看到PTS/DTS是打在PES包里面的,这两个parameters是解决视音频同步显示,防止解码器输入缓存上溢或下溢的关键。PTS表示 显示单元出现在系统目标解码器(STD:system target decoder)的时间,DTS表示将存取单元全部字节从STD的ES解码缓存器移走的时刻。每个I、P、B帧的包头都有一个PTS和DTS,但PTS与DTS对B帧都是一样的,无须标出B帧的DTS。对I帧和P帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,一定要分别标明PTS和DTS。
(2)节目专用信息PSI(Program Specific Information)
管理各种类型的TS数据包,需要有些特殊的TS包来确立各个TS数据包之间的关系。这些特殊的TS包里所包含的信息就是节目专用信息。在不同的标准中它有不同的名字:
① MPEG-2中称为PSI;
② DVB标准根据实际需要,对PSI扩展,称为SI信息;
③ ATSC标准中为PSIP信息;
MPEG-2中,规定的对PSI信息的描述方法有以下几种:
ITU-T Rec.H.222.0 | ISO/IEC 13818-1中定义的 PSI表可被分成一段或多段置于传输流分组中。一段就是一个语法结构,用来将ITU-T Rec.H.222.0 | ISO/IEC 13818-1中定义的PSI表映射到传输流分组中。
1)PAT表
TS流中包含一个或者多个PAT表。PAT表由PID为0x0000的TS包传送,其作用是为复用的每一路传送流提供所包含的节目和节目编号,以及对应节目的PMT的位置即PMT的TS包的PID值,同时还提供NIT的位置,即NIT的TS包的PID的值。
2)PMT表
PMT在传送流中用于指示组成某一套节目的视频、音频和数据在传送流中的位置,即对应的TS包的PID值,以及每路节目的节目时钟参考(PCR)字段的位置。
原始流的类型
对PS流而言,每个PES包头含有PTS和DTS,流识别码,用于区别不同性质ES。然后通过PS复用器将PES包复用成PS包。实际上是将PES包分解为更细小的PS包。在解码的时候,解复用器将PS分解成一个个PES包,拆包器然后将PES包拆成视频和音频的ES,最后输入至各自解码器进行解码。一个问题是:各个ES在解码时,如何保证视音频的同步呢?除了PTS和DTS的配合工作外,还有一个重要的参数是SCR(system clock reference)。在编码的时候,PTS,DTS和SCR都是由STC(system time clock)生成的,在解码时,STC会再生,并通过锁相环路(PLL-phase lock loop),用本地SCR相位与输入的瞬时SCR相位锁相比较,以确定解码过程是否同步,若不同步,则用这个瞬时SCR调整27MHz的本地时钟频率。最后,PTS,DTS和SCR一起配合,解决视音频同步播放的问题。PS格式摘录如下:
PS包的长度比较长且可变,主要用于无误码环境里,因为越长的话,同步越困难,且在丢包的情况下,重组也越困难。所以,PS适合于节目信息的编辑和本地内容应用的application。
MPEG-4全称为Moving Picture Experts Group 4,是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通过,第二版在1999年12月通过。MPEG-4格式的主要用途在于网上流、光盘、语音发送(视频电话),以及电视广播。
MPEG-4的特点:
(1)对于不同的对象可采用不同的编码算法,从而进一步提高压缩效率;
(2)对象各自相对独立,提高了多媒体数据的可重用性;
(3)允许用户对单个的对象操作,提供前所未有的交互性;
(4)允许在不同的对象之间灵活分配码率,对重要的对象可分配较多的字节,对次要的对象可分配较少的字节,从而能在低码率下获得较好的效果;
(5)可以方便的集成自然音视频对象和合成音视频对象。
MPEG-4由一系列的子标准组成,被称为部,包括以下的部分。对于媒体编解码,重点关注Part2,Part 3,Part 10。
第一部(ISO/IEC 14496-1):系统
描述视频和音频的同步以及混合方式(Multiplexing,简写为MUX)。定义了MP4容器格式,支持类似DVD菜单这样的直观和互动特性等。
第二部(ISO/IEC 14496-2):视频
定义了一个对各种视觉信息(包括视频、静止纹理、计算机合成图形等等)的编解码器。对视频部分来说,众多“Profiles”中很常用的一种是Advanced Simple Profile (ASP),例如XviD编码就属于MPEG-4Part 2。包括3ivx,DivX4/Project Mayo,DivX 5,Envivio,ffmpeg/ffds,pegable,Nero Digital,QuickTime,Sorenson,XviD等常见的视频格式, 需要注意的是Divx 3.11,MS MPEG-4,RV9/10,VP6,WMV9并不属于标准的MPEG-4标准。
第三部(ISO/IEC 14496-3):音频
定义了一个对各种音频信号进行编码的编解码器的集合。包括高级音频编码(Advanced Audio Coding,缩写为AAC) 的若干变形和其他一些音频/语音编码工具。即AAC音频标准,包括LCAAC,HE AAC等,支持5.1声道编码,可以用更低的码率实现更好的效果(相对于MP3,OGG等)。
第四部(ISO/IEC 14496-4):一致性
定义了对本标准其他的部分进行一致性测试的程序。
第五部(ISO/IEC 14496-5):参考软件
提供了用于演示功能和说明本标准其他部分功能的软件。
第六部(ISO/IEC 14496-6):多媒体传输集成框架
即DMIF:Delivery Multimedia Integration Framework
第七部(ISO/IEC 14496-7):优化的参考软件
提供了对实现进行优化的例子(这里的实现指的是第五部分)。
第八部(ISO/IEC 14496-8):在IP网络上传输
定义了在IP网络上传输MPEG-4内容的方式。
第九部(ISO/IEC 14496-9):参考硬件
提供了用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案。
第十部(ISO/IEC 14496-10):进阶视频编码,也即ITU H.264,常写为H.264/AVC
或称高级视频编码(Advanced Video Coding,缩写为AVC):定义了一个视频编解码器(codec),AVC和XviD都属于MPEG-4编码,但由于AVC属于MPEG-4Part 10,在技术特性上比属于MPEG-4 Part2的XviD要先进。另外从技术上讲,它和ITU-T H.264标准是一致的,故全称为MPEG-4 AVC/H.264。
第十一部(ISO/IEC 14496-11):场景描述和应用引擎
可用于多种profile(包括2D和3D版本)的互交互媒体。修订了MPEG-4 Part 1:2001以及Part1的两个修订方案。它定义了应用引擎(交付,生命周期,格式,可下载Java字节代码应用程序的行为),二进制场景格式 (BIFS:Binary Format for Scene),可扩展MPEG-4文本格式(一种使用XML描述MPEG-4多媒体内容的文本格式)系统level表述。也就是MPEG-4 Part21中的BIFS,XMT,MPEG-J。
第十二部(ISO/IEC 14496-12):基于ISO的媒体文件格式
定义了一个存储媒体内容的文件格式。
第十三部(ISO/IEC 14496-13):IP
知识产权管理和保护(IPMP for Intellectual Property Management and Protection)拓展。
第十四部(ISO/IEC 14496-14):MPEG-4文件格式
定义了基于第十二部分的用于存储MPEG-4内容的视频文件格式。
第十五部(ISO/IEC 14496-15):AVC文件格式
定义了基于第十二部分的用于存储第十部分的视频内容的文件格式。
第十六部(ISO/IEC 14496-16):动画框架扩展(AFX : Animation Framework eXtension)。
第十七部(ISO/IEC 14496-17):同步文本字幕格式
第十八部(ISO/IEC 14496-18):字体压缩和流式传输(针对公开字体格式)。
第十九部(ISO/IEC 14496-19):综合用材质流(Synthesized Texture Stream)。
第二十部(ISO/IEC 14496-20):简单场景表示(LASeR: Lightweight Scene Representation)。
第二十一部(ISO/IEC 14496-21):用于描绘(Rendering)的MPEG-J拓展
第二十二部分(ISO/IEC 14496-22):开放字体格式(Open Font Format)。
第二十三部分(ISO/IEC 14496-23):符号化音乐表示(Symbolic Music Representation)。
第二十四部分(ISO/IEC 14496-24):音频与系统交互作用(Audio and systems interaction)。
第二十五部分(ISO/IEC 14496-25):3D图形压缩模型(3D Graphics Compression Model)。
第二十六部分(ISO/IEC 14496-26):音频一致性检查
定义测试音频数据与ISO/IEC 14496-3是否一致的方法(Audio conformance)。
第二十七部分(ISO/IEC 14496-27):3D图形一致性检查
定义测试3D图形数据与ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14496-21:2006,和ISO/IEC 14496-25:2009是否一致的方法(3D Graphics conformance)。
先来分析它的层次结构,它可以分为5个层次(对应着图看,非常清楚):
(1)视频对象序列VOS。
(2)VO(Video Object):视频对象,它是场景中的某个物体,最简单的情况下就是矩形框,它是有生命期的,由时间上连续的许多帧构成。
(3)VOL(Video Object Layer):视频对象层,VO的三种属性信息在该层进行编码,该层主要用来扩展VO的时域和空域分辨率,实现分成编码。
(4)GOV:视频对象平面组,由视频平面组合,是可选成分。视频对象层即可以由VOP直接组合,也可以由GOV组合而成。
(5)VOP(Video Object Plane):视频对象平面,它可以看作是VO在某一时刻的采样,即一帧VO。
MPEG4码流开头往往如下:
00 00 01 B0 F5 00 00 01 B5 09 00 00 01 00 00 00
01 20 08 86 84 00 3F 18 58 21 20 A3 1F 00 00 01
B2 58 76 69 44 30 30 36 32 00 00 01 B6
根据标准,定义如下:
00 00 01 B0是视频对象序列开始标志(VISOBJSEQ_START_CODE),其后的数据只有一位F5,表示此视频对象编码序列编码的Profile与Level类型是XVID_PROFILE_AS_L4, Profile类型数值定义于xvid.h。
00 00 01 B5是视频对象开始标志(VISOBJ_START_CODE),其后只有一位16进制数据09,从这一位数据可以获得视频对象版本号、视频类型和视频信号类型信息。
00 00 01 00是视频对象开始标志(VIDOBJ_START_CODE),00 00 01 20是视频对象层开始标志(VIDOBJLAY_START_CODE),其后的11位16进制数据比较重要,解码所需要的VOP纵横比、视频对象形状和图像分辨率等数据都是从这11位数据获得的。
00 00 01 B2是用户数据开始标志(USERDATA_START_CODE),十六进制用户数据共有8位。
00 00 01 B6是VOP开始标志(VOP_START_CODE),每个VOP编码数据都以VOP标识头开始,VOP标识头比较简单,如果用16进制数据表示其数值为00 00 01 B6。解码的时候,以00 00 01 B6来判定是不是一个VOP的开始,并从VOP标识头后的数据读取编码类型,量化值等参数后完成一帧VOP的解码。紧跟着VOP开始的,有一个2bit 的标志,用来表示这个Frame到底是一个 I Frame,P Frame,B Frame抑或是S Frame(GMS-VOP)。
标志如下:
00: I Frame
01: P Frame
10: B Frame
11: S Frame
00 00 01 b6之后的下一个字节的高两位,00表示I frame, 01表示P frame,10表示B frame。可以简单拿个图说明一下,下图中,第一个VOS的开头,第二个是一个I Frame:
国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。而H.264则是由两个组织(ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG))联合组建的联合视频组(JVT,Joint Video Team)共同制定的高度压缩数字视频编解码器标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码(Advanced Video Coding,AVC)的第10 部分。因此,不论是MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264。
H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。
优势:
(1)低码率(Low Bit Rate):和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。
(2)高质量的图像:H.264能提供连续、流畅的高质量图像(DVD质量)。
(3)容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。
(4)网络适应性强:H.264提供了网络抽象层(Network Abstraction Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。
H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。低码率(Low Bit Rate)对H.264的高的压缩比起到了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。
H.264/AVC可工作于多种速率,广泛应用于Internet/intranet上的多媒体流服务、视频点播、可视游戏、低码率移动多媒体通信 (视频 手机等)、交互式多媒体应用、实时多媒体监控、数字电视与演播电视和虚拟视频会议等,大有在上述领域一统天下的趋势,有非常广泛的开发和应用前景。
(1)场和帧:视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。
(2)片:每个图象中,若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。
I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。
片的目的是为了限制误码的扩散和传输,使编码片相互间是独立的。
某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。
(3)宏块:一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。
(4)数据之间的关系:
H.264结构中,一个视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由16x16的yuv数据组成。宏块作为H264编码的基本单位。
(5)H264编码过程中的三种不同的数据形式:
① SODB数据比特串 ---->最原始的编码数据,即VCL数据;
② RBSP 原始字节序列载荷 ---->在SODB的后面填加了结尾比特(RBSP trailing bits:一个bit“1”,若干比特“0”),以便字节对齐;
③ EBSP 扩展字节序列载荷 ---- > 在RBSP基础上填加了仿校验字节(0X03)它的原因是:在NALU加到Annexb上时,需要添加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示0x00000001,否则用3位字节表示0x000001(是一帧的一部分)。另外,为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。
H.264码流分Annex-B和AVCC两种格式。
AVCC格式:也叫AVC1格式,MPEG-4格式,字节对齐,因此也叫Byte-Stream Format。用于mp4/flv/mkv, VideoToolbox。
Annex-B格式:也叫MPEG-2 transport stream format格式(ts格式), ElementaryStream格式。
区别有两点:一个是参数集(SPS, PPS)组织格式;一个是分隔。
Annex-B:使用start code分隔NAL(start code为三字节或四字节,0x000001或0x00000001,一般是四字节);SPS和PPS按流的方式写在头部(即在ES中)。
AVCC:使用NALU长度(固定字节,通常为4字节)分隔NAL;在头部包含extradata(或sequence header)的结构体。(extradata包含分隔的字节数、SPS和PPS,具体结构见下)
注意:SPS和PPS是封装在container中,每一个frame前面是这个frame的长度;SPS的头部是0x67,PPS的头部是0x68,要保持对数据的敏感性。
1> H.264/AVC extradata 语法
参考:《ISO/IEC 14496-15 NAL unit structured video》AVCDecoderConfigurationRecord结构:(最小长度7字节)
MPEG-4 Part 15 “Advanced Video Coding (AVC) file format” section 5.2.4.1 的规定如下:
aligned(8) class AVCDecoderConfigurationRecord {
unsigned int(8) configurationVersion = 1;
unsigned int(8) AVCProfileIndication;
unsigned int(8) profile_compatibility;
unsigned int(8) AVCLevelIndication;
bit(6) reserved = ‘111111’b;
unsigned int(2) lengthSizeMinusOne;
bit(3) reserved = ‘111’b;
unsigned int(5) numOfSequenceParameterSets;
for (i=0; i< numOfSequenceParameterSets; i++) {
unsigned int(16) sequenceParameterSetLength ;
bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
}
unsigned int(8) numOfPictureParameterSets;
for (i=0; i< numOfPictureParameterSets; i++) {
unsigned int(16) pictureParameterSetLength;
bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
}
}
说明: FFmpeg中,extradata解析,见ff_h264_decode_extradata()
注意:
第5字节的最后2位,表示的就是NAL size的字节数。在AVCC格式中,每个NAL前面都会有NAL size字段。NAL size可能是1字节、2字节或4字节(4字节较常见),解析extradata重要目的就是确认这个值。(而Annex-B格式,要split NAL,只要去探测0x000001就可以了)
extradata 如上
extrasize 47
05| FF NAL size: 4字节
06| E1 SPS num: 1
07| 00 1F SPS size: 31字节
09| 67 NAL type: SPS
40| 01 PPS num: 1
41| 00 05 PPS size: 5字节
42| 68 NAL type: PPS
H.264从层次来看分为两层:视频编码层(VCL,Video Coding Layer)和网络提取层(NAL,Network Abstraction Layer)。VCL输出的是原始数据比特流(SODB,String of data bits),表示H.264的语法元素编码完成后的实际的原始二进制码流。SODB通常不能保证字节对齐,故需要补齐为原始字节序列负荷(RBSP,Raw Byte Sequence Payload)。NAL层实际上就是最终输出的H.264码流,它是由一个个NALU组成的,每个NALU包括一组对应于视频编码数据的NAL头信息和一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload)。以上名词之间的关系如下:
RBSP = SODB + RBSP trailing bits
NALU = NAL header(1 byte) + RBSP
H.264 = Start Code Prefix(3 bytes) + NALU + Start Code Prefix(3 bytes) + NALU +…
所以H.264码流的结构如下:
H.264码流层次结构为:
编码器将每个NALU各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NALU的分界,并依次取出NALU进行解码。每个NALU之间由起始码(Start Code Prefix)分隔,起始码分为两种:0x000001(3 bytes)or 0x00000001(4 bytes),解码器检测每个起始码,作为一个NALU的起始标识,当检测到下一个起始码时,当前NALU结束。如果NALU 对应的Slice 为一帧的开始,则用4 字节表示,即0x00000001;否则用3 字节表示,0x000001。NALU针对起始码设计了防止冲突机制,如果编码器检测到NALU数据存在0x000000,0x000001,0x000002或0x000003时,编码器会在最后一个字节前插入一个新的字节0x03,如下:
0x00 00 00 -> 0x00 00 03 00
0x00 00 01 -> 0x00 00 03 01
0x00 00 02 -> 0x00 00 03 02
0x00 00 03 -> 0x00 00 03 03
解码器检测到0x000003时,把03抛弃,恢复原始数据(脱壳操作)。解码器在解码时,首先逐个字节读取NALU的数据,统计NALU的长度,然后再开始解码。
一个NALU就是编码后的一帧数据。每个NAL单元是一个一定语法元素的可变长字节字符串,包括一个字节的头信息(用来表示数据类型),以及若干整数字节的负荷数据。一个NAL单元可以携带一个编码片、A/B/C型数据分割或一个序列或图像参数集。NALU头用来标识后面的RBSP是什么类型的数据,它是否会被其他帧参考以及网络传输是否有错误。
NAL的解码单元的流程如下:
(1)NAL header是一个字节(length = 1byte):
forbidden_bit(1bit) + nal_reference_bit(2bit) + nal_unit_type(5bit)
① forbidden_bit:禁止位,初始为0,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
② nal_reference_bit:nal重要性指示,标志该NAL单元的重要性,取值范围为0~3,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。H.264规定,如果当前NALU是序列参数集,或是图像参数等,该值必须大于0。比如nal_unit_type等于5时,nal_reference_bit大于0;nal_unit_type等于6,9,10,11或12时,nal_reference_bit等于0。
不同类型的NALU的重要性指示如下表所示。
Nal_unit_type | NAL类型 | Nal_reference_bit |
---|---|---|
0 | 未使用 | 0 |
1 | 非IDR的片 | 此片属于参考帧,则不等于0,不属于参考帧,则等于0 |
2 | 片数据A分区 | 同上 |
3 | 片数据B分区 | 同上 |
4 | 片数据C分区 | 同上 |
5 | IDR图像的片 | 5 |
6 | 补充增强信息单元(SEI) | 0 |
7 | 序列参数集 | 非0 |
8 | 图像参数集 | 非0 |
9 | 分界符 | 0 |
10 | 序列结束 | 0 |
11 | 码流结束 | 0 |
12 | 填充 | 0 |
13…23 | 保留 | 0 |
24…31 | 不保留 | 0 |
所谓参考帧,就是在其他帧解码时需要参照的帧。比如一个I帧可能被一个或多个B帧参考,一个B帧可能被某个P帧参考。
从这个表我们也可以看出来,DIR的I帧是非常重要的,它一丢,那么这个序列的所有帧都没办法解码了;序列参数集和图像参数集也很重要,没有序列参数集,这个序列的帧就没法解;没有图像参数集,那用到这个图像参数集的帧都没法解。
③ nal_unit_type:NALU类型取值如下表所示:
Nal_unit_type | NAL类型 | C |
---|---|---|
0 | 未使用 | |
1 | 非IDR图像中不采用数据划分的片段 | 2,3,4 |
2 | 非IDR图像中A类数据划分片段 | 2 |
3 | 非IDR图像中B类数据划分片段 | 3 |
4 | 非IDR图像中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 | 不保留(RTP打包时会用到) |
RTP打包时的扩展类型
24 | STAP-A | Single-time aggregation packet |
25 | STAP-B | Single-time aggregation packet |
26 | MTAP16 | Multi-time aggregation packet |
27 | MTAP24 | Multi-time aggregation packet |
28 | FU-A | Fragmentation unit |
29 | FU-B | Fragmentation unit |
30-31 | undefined |
NALU的顺序要求:
H.264/AVC标准对送到解码器的NAL单元顺序是有严格要求的,如果NAL单元的顺序是混乱的,必须将其重新依照规范组织后送入解码器,否则解码器不能够正确解码。
1)序列参数集NAL单元
必须在传送所有以此参数集为参考的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的序列参数集NAL单元。
所谓重复的详细解释为:序列参数集NAL单元都有其专门的标识,如果两个序列参数集NAL单元的标识相同,就可以认为后一个只不过是前一个的拷贝,而非新的序列参数集。
2)图像参数集NAL单元
必须在所有以此参数集为参考的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的图像参数集NAL单元,这一点与上述的序列参数集NAL单元是相同的。
3)不同基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元在顺序上不可以相互交叉,即不允许属于某一基本编码图像的一系列片段(slice)单元和数据划分片段(data partition)单元中忽然出现另一个基本编码图像的片段(slice)单元片段和数据划分片段(data partition)单元。
4)参考图像的影响:如果一幅图像以另一幅图像为参考,则属于前者的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于后者的片段和数据划分片段之后,无论是基本编码图像还是冗余编码图像都必须遵守这个规则。
5)基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于相应冗余编码图像的片段(slice)单元和数据划分片段(data partition)单元之前。
6)如果数据流中出现了连续的无参考基本编码图像,则图像序号小的在前面。
7)如果arbitrary_slice_order_allowed_flag置为1,一个基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元的顺序是任意的,如果arbitrary_slice_order_allowed_flag置为零,则要按照片段中第一个宏块的位置来确定片段的顺序,若使用数据划分,则A类数据划分片段在B类数据划分片段之前,B类数据划分片段在C类数据划分片段之前,而且对应不同片段的数据划分片段不能相互交叉,也不能与没有数据划分的片段相互交叉。
8)如果存在SEI(补充增强信息)单元的话,它必须在它所对应的基本编码图像的片段(slice)单元和数据划分片段(data partition)单元之前,并同时必须紧接在上一个基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元后边。假如SEI属于多个基本编码图像,其顺序仅以第一个基本编码图像为参照。
9)如果存在图像分割符的话,它必须在所有SEI 单元、基本编码图像的所有片段slice)单元和数据划分片段(data partition)单元之前,并且紧接着上一个基本编码图像那些NAL单元。
10)如果存在序列结束符,且序列结束符后还有图像,则该图像必须是IDR(即时解码器刷新)图像。序列结束符的位置应当在属于这个IDR图像的分割符、SEI 单元等数据之前,且紧接着前面那些图像的NAL单元。如果序列结束符后没有图像了,那么它的就在比特流中所有图像数据之后。
11)流结束符在比特流中的最后。
(2)RBSP
RBSP数据是下表中的一种:
RBSP类型 | 缩写 | 描述 |
---|---|---|
参数集 | PS | 序列的全局信息,如图像尺寸、视频格式等 |
增强信息 | SEI | 视频序列解码的增强信息 |
图像界定符 | PD | 视频图像的边界 |
编码片 | SLICE | 编码片的头信息和数据 |
数据分割 | DP片层的数据,用语错误恢复解码 | |
序列结束符 | 表明一个序列的结束,下一个图像为IDR图像 | |
流结束符 | 表明该流中已没有图像 | |
填充数据 | 亚元数据,用于填充字节 |
从前面的分析我们知道,VCL层出来的是编码完的视频帧数据,这些帧可能是I、B、P帧,而且这些帧可能属于不同的序列,再者同一个序列还有相对应的一套序列参数集和图片参数集等等,所以要完成视频的解码,不仅需要传输VCL层编码出来的视频帧数据,还需要传输序列参数集、图像参数集等数据。
参数集:包括序列参数集 SPS和图像参数集 PPS。SPS包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。
数据分割:组成片的编码数据存放在3个独立的DP(数据分割,A、B、C)中,各自包含一个编码片的子集。分割A包含片头和片中每个宏块头数据。分割B包含帧内和 SI 片宏块的编码残差数据。分割 C包含帧间宏块的编码残差数据。每个分割可放在独立的 NAL 单元并独立传输。
VC-1即Video Codec One(视频解码方案一)。它起源于微软公司的Windows Media Video 9。VC-1是继MPEG-2 TS和H.264之后,最后被认可的高清编码标准格式。VC-1虽然是最后被认可的高清编码格式,不过因为有微软的后台,所以这种编码格式不能小窥。相对于MPEG2,VC-1的压缩比更高,但相对于H.264而言,编码解码的计算则要稍小一些。
总的来说,从压缩比上来看,H.264的压缩比率更高一些,也就是同样的视频,通过H.264编码算法压出来的视频容量要比VC-1的更小,但是VC-1格式的视频在解码计算方面则更小一些,一般通过高性能的CPU就可以很流畅的观看高清视频。目前来看,VC-1可能是一个比较好的平衡,辅以微软的支持,应该是一只不可忽视的力量。一般来说,VC-1多为 “.wmv”后缀,但这都不是绝对的,具体的编码格式还是要通过软件来查询。
WMV(Windows Media Video)是微软开发的一系列视频编解码和其相关的视频编码格式的统称,是微软Windows媒体框架的一部分。WMV包含三种不同的编解码:作为RealVideo的竞争对手,最初为Internet上的流应用而设计开发的WMV原始的视频压缩技术;另一种是为满足特定内容需要的WMV屏幕和WMV图像的压缩技术;在经过SMPTE(Society of Motion Picture and Television Engineers)学会标准化以后,WMV版本9被采纳作为物理介质的发布格式,比如高清DVD和蓝光光碟,即所谓的VC-1。
微软也开发了一种称之为ASF(Advanced Systems Format)的数字容器格式,用来保存WMV的视频编码。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。
我们还可以经常看的到Divx、Xvid,这两个也很容易弄混。
其实两者确实有很大渊源。DivX是一种将影片的音频由MP3来压缩、视频由MPEG-4技术来压缩的数字多媒体压缩格式。DivX就是从微软公司MPEG-4 v3编码技术中派生出的最为知名以及被广大DVDRipper广泛采用的视频编码技术。用它编码的视频文件不仅最大程度上还原了DVD原本的画面质量,而且可以允许你选择几乎所有格式的音频.它的视频部分采用的是微软的MPEG-4技术进行压缩,而音频部分则是采用MP3或WMA进行压缩,然后把视频和音频部分进行完美组合成让我们耳目一新的AVI文件,就是DivX影片了。DivX最早是由国外的一名电脑游戏玩家和一名黑客制作,他们破解了微软的MPEG-4视频压缩算法而后重新改写并重新命名为DivX。
XviD是目前世界上最常用的视频编码解码器(codec),而且是第一个真正开放源代码的,通过GPL协议发布。在很多次的codec比较中,XviD的表现令人惊奇的好,总体来说是目前最优秀、最全能的codec。可以说XviD是与Divx一脉相承而又有所加强的。