88bf必发娱乐官网登入打包TS流

召开此事物非常悠久了,从上年十二月份起之,快5单月了。。。期间因做事一直断断续续,直到日前才生了头进展,也便顶这结束吧。

先期说下自己举行的是什么吧,总的来说,就是把H264视频流与AAC音频流封装成TS格式。要就如此个功能首先要解析H264跟AAC,获得视频帧和音频帧以及有着重信息,比如帧率、采样率什么的也罢其后的打包做工作。分析到各个一样轴数据后,再添加PES头,封装成PES数据,在此过程要留意打PTS、DTS,以及PES类型的设定,一般的话,视频PTS与DTS都使打,而音频只待打PTS。最后一步就是是以PES数据封装成TS了,这无异于步之坑比较多。做了这些,最难个人感觉就是音视频同步了,至今还比疑惑,视频播出来总是发生毛病。

一、解析h264

H264是以0x00 00 01要么0x00 00 00
01看作分割NALU单元分割符的,整个H264也是因NALU作为中心单元的,NALU的组织要图一律所出示:

 图1

NALU包含头和负载RBSP,头部的句法结构如图二所展示:

·图2

旋即一个字节便蕴藏了通脑袋的消息,也就是是去除分割符后的腔一个字节。nal_unit_type指明的NALU的类,不多说了,贴图吧。。。

图3

NALU的负载RBSP在读取有效数据之前率先要开去除竞争码的操作,遇到0x00 00
03将配节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

负载的类型由前文nal_unit_type指定,当值大于等于1,小于等于5底当儿指明该负载是片数量(slice),去除竞争码后底载重采用的凡哥伦布编码。在看片数据句法结构的时段可小心到每个字段后面还有局部符号说明,如ue(v)se(v),给张图看的比较清楚

图4

自家贴的凡片头句法的同样有的,在合成TS的时光要判断片类型就可以了,也就是说,只要以图4的slice_type剖析产生即可,要惦记完全的解出片还是发生接触难度之,不过判断片的色并无麻烦。

回来前面的哥伦布编码,这是一模一样栽变长编码,括号里带v的都是借助编码的长度不定点。

要基于哥伦布编码动态确定,或出于前文指定,符号ue(v)se(v)说明解码的长短可因哥伦布编码的条条框框动态指定,而u(v)此处的解码长度得由上文指定,有几乎单字段都是这样,如何由上文确定长度的材料不太好找,只找到一个英文的网站,它说明了几单字段(http://m.blog.csdn.net/article/details?id=40302581)

解码哥伦布编码的字段可以选用网上的库房,看起还实施,但坐是以研上之事物,

自选了投机实现之算法,也不是专程复杂。首先说生无符号的哥伦布编码,按网上的定义,哥伦布的编码方式有0阶、1品级、2阶…每种恍若都未等同,也绝非还失去研究,因为H264用到之就是0阶的哥伦布编码,弄明白是就算够用了。

1.1无符号0阶指数哥伦布编码(ue)**

本算法的讲述,应先将数据为二进制方式排列,接着连续读取M个0比特位,碰到1比特位结束读取,这时解码的多少长度就已确定了,为2*M+1单比特,包含前面都读取的M个0比仅。再以最后的M位比特转化成为十上制数值W,即可得到解码结果也W-1,到此结束,一坏完整的无符号解码就得了。

·无符号哥伦布编码测试例子:

                                                  (解码后)

0x4C  0x85  0x31  0xC4  0x09 =====> 1  2  3  4  5  6  7  8

1.2闹号0阶指数哥伦布编码(se)

产生号子的哥伦布编码建立于无符号的根底及,按照无符号的解码步骤得到十向前制数n后,再实践以下的动作即可。

·获取n被2除后底商w(注意这个协议是错过除了小数的平头部分)

·n不能被2整理除了,w加1为解码结果

·n可以让2理除了,w的相反数即为解码结果

                                                (解码后)

0x4C  0x85  0x31  0xC4  0x09 =====>1  -1  2  -2  3  -3  4  -4

1.3帧类型

前在解析片数据的时节发出关联过片的种类,实际上这里指明的凡片所装载的视频帧的类别,按定义分为I,P,B,SP,SI,图5受出slice_type跟帧类型的附和关系

图5

自我在解码的上只是关注了I,P,B帧,另外的有限种植帧的意思感觉与I,P帧类似,所以并未开过多的研究。I,P,B帧的别在编码方式的别,I帧数据不因其他的轴数据,可独立解码,而P帧使用前为预测编码,它的解码依靠前面解码的I帧和P帧,B帧用了双向预测编码,解码B帧图像,需要以参考前后的轴数据。它们压缩数量的力量为逐一增长,一般的话,B帧比较多之网络视频流同等比特量所传的视频质量会再次胜,但是相应的,播放器的解码压力吧再也可怜。由于P、B帧的解码需要参考其他帧,所以于解码的当儿可能会见发误码扩散之情况,但出于播放器在撞I帧的时会丢弃之前解码的视频数据,再因当下之I帧作为以后P、B帧的参考帧,因此就同一行径及时的拦截了不当的扩散,说及这里,我得额外提下HLS协议,这个协议于做切片的时刻总是以I帧开头,不仅是为着当播视频的早晚这刷出图像,我眷恋再多的是因H264这种编码格式的限量而只能为I帧开头,因为就来I帧是得独立解码的,如果起的凡另外需要参考的轴,他们之解码毫无意义。

二、打包PES

PES是针对性裸流的同等层封装,H264和AAC就是少数栽裸流,他们即比如还不曾订的写,随意的为堆放于角落里,PES的包就是以乱的纸打及页码装成书的历程。这里的页码指的虽是PTS与DTS,显示时间穿和解码时间戳,这个时空可以指示播放器何时显示平轴图像或者音频,一般的话视频帧PTS、DTS都急需由,尤其是以来B帧的图景下,因为B帧需要参考前后两幅,所以她而赶前后帧都被解码来后才能够解此B帧,因此B帧的亮时间与解码时间是不等同的,而音频帧没有这种场面,解一帧放平轴即可,它是无欲DTS的。PES头的句法结构如图6

 图6(1)

  图6(2)

PES的整理结构没有整的糊上去,只贴到PTS、DTS这有些句法,其实以打包TS的时候,这有已够了,其他的好无去关注。接下来说明一下几个重大之字段。

·packet_start_code_prefix

这3只字节是PES的起始码,将PES包一一隔开,起始是定位的0x00 0x00 0x01

·stream_id

指明PES负载的品类,视频为0xE0,音频为0xC0

·PES_packe_length

证明在这字段最后一个字节之后PES分组的字节数。‘0’值表明PES分组的长度既无征呢未尝限定,这种情形只有当PES分组的行载荷是传递流分组中之视频原始流时才允。

·PTS_DTS_flag

2号标志,若否‘10’,则PES分组首部有PTS字段;若为‘11’,则PES分组首部有PTS和DTS字段;若否’00’则PTS和DTS都非以PES分组首部出现;‘01’值为禁。

·PES_header_data_length

证以是字段最后一个字节还剩余的PES头部分组数据量,一般可能指的凡PTS与DTS部分编码的长短。

PES分组中比根本的字段就地方这些的,对于PTS与DTS的编解码,按照PTS_DTS_flag以及相应的句法指示去举行即可。

三、合成TS

TS流每个包之尺寸都在188-204字节之间,一般就是是188字节,每个PES包为主都过188字节,所以当拿PES封装成TS时,需要以PES分割成多单TS包,每个包都出唯一的ID标识它的色,音视频PES打包成TS包之ID由TS中之PMT表指定,PMT表被单独从成一个TS包,它吗产生ID标识,这个标识由PAT表指定,与PMT类似,PAT也为由成单身的担保,它的ID是一贯的0,所以,不管是解码还是编码TS流,都应于PAT表入手。

3.1 TS包格式

  图7

TS包由头与负载组成,头部占四只字节,如果还有从适应区,那么自从适应区底尺寸由第五独字节指定。这里先简要的解析下TS头的前面四单字节。

·sync_byte

此是共同字节,固定啊0x47

·transport_error_indicator

其一比较特位我莫用到了,一直还是0

·payload_unit_start_indicator

这个于特位为1,标志在PES包负载的开始,不仅如此,如果是PAT、PMT包,这里也为置为1

·transport_priority

自我暂时没有利用,默认是0

·PID

每个包种类的标识

·transport_scrambling_control

我少未以

·adaptation_field_control

其一字段标识是否出起适应区

00:是保留值。

01:负载着只有有效载荷。

10:负载着仅仅生自适应字段。

11:先出由适应字段,再闹有效载荷。

如果带有自适应区,那么头季个字节后即是从适应区的码流结构,最后才是TS包之负载部分

·continuity_counter

本条字段的值由00 – 15屡屡连续变

3.2打适应区格式

 图8

·adaptation_field_length

这字节指明了于适应区底长,不含此字节

·PCR_flag

要是此位被置为1,按照句法格式,接下去有PCR值,这个价值按照一定的公式转化成了program_reference_baseprogram_clock_reference_extension简单独字段的价

PCR是音视频同步的重要性参数,它控制播放器什么时候播放一帧音频或者视频,它实质上是一个像样于流年穿的物,它好用PES包之PTS或DTS来赋值,假而这个价值是timestamp,那么即使有

program_clock_reference_base=  timestamp       (mod)  2^33

program_clock_reference_extension  = (300 * timestamp)  (mod)
 300

PCR  =program_clock_reference_base* 300
 +program_clock_reference_extension

3.3PAT表

 图9

PAT表指明了PMT表的PID,每个PMT表又可以指出音视频包的PID值,从这边可以视一个PMT表就代表一个音视频流,或者说一个剧目,当有多PMT表时,说明当是TS流着留存多音视频流,多只剧目,从而实现了节目复用的法力,实际上PAT表是得索引多种PMT表的,但自身以打流的下仅及了平栽PMT,没涉及,东西在强硬不在多,把同种研究透了,其他的吗就算是复制粘贴的职能。

祈求10贴的是PAT表负载的section部分,简单的分开下PAT表四独区域,第一个是条季个字节,第二是由适应区,不过这个从适应区并未内容,因此标志由适应长度的老大字节为0,第三独就是是其一section部分,在中指明了PMT表的PID值,第四单凡是填充区域,严格来说,它同section共同做了ts包负载的片,一般填充区域之较特位都进否1。

·table_id

PAT表此值为0

·section_syntax_indicator

是职务也1

·reserved

像这种标志比特位都是置为1的

·section_length

当下12各项指出了由该字段之后到CRC_32(包含它)为止的字节数

·CRC_32

4字节的循环校验码,它根据section区域动态计算得出

3.4 PMT表

图10(1)

 图10(2)

PMT表的意向是稳音视频包的PID值,以利播放器找到并解码,接下说下几乎单主要之字段。

·table_id

这里的价固定为0x02

·PCR_PID

此字段指明了PCR值所在TS包的PID

·program_info_length

指定了连下去描述子decriptor()的尺寸,没什么要描述的就置为0吧

·stream_type

流类型,如下图所示

H264的视频,流类型为0x1b,AAC音频一般为0x0f,随后的PID值就是应和之TS包标识了

·ES_info_length

说明ES流的叠加信,可发出可管,如果没有增大信,这个字段值为0

·CRC_32

以及PAT的校验码类似

3.5打包H264视频帧

貌似的话,一个负载为I、P、B片的PES包可看做一帧,也许说的匪绝标准,一帧视频从概念上实属连环画的完全的一致页,而相同切片啊可能就是独自是平页的一对画面了,但自身包的时是根据I、B、P片为单位之,为了好明为让一样轴吧。

梳理下于H264到TS的进程,首先H264的特元叫NALU,一个I、B、P片就相应一个NALU,NALU加上PES头从上PTS或DTS后取一个PES包,我们现设做的尽管是以此蕴含视频数据的PES包分割成一个同时一个底TS包,也便是包一帧视频。

PES包数据在打包TS时,均作TS包之负载部分。装载PES的首先独TS包,前面说了,payload_unit_start_indicator字段要为1,这标志在平等轴PES数据的开头。一般从包视频帧的时候吗会见从及PCR的价,不是每帧都设由,不过对此I帧最好要打上。还有少数如留心的凡,在起NALU到PES的当儿,在每帧数据前都要添加0x000000
01 09
xx
立刻六个字节,然后还打PES头,xx的值好像得擅自选定,如此打起的流苹果之类的播放器才能够支持。

末再说下I帧,在打包I帧的时段可比打包其他两帧有双重多欲注意的题材,首先,在I帧的先头最好能起上PAT与PMT表,如此一来,在随机一段子的TS流中,只要包含了I帧,那么闹深充分几乎带队得以叫解码播放,这也是TS流的一个特性。H264除开包含I、B、P的NALU外,还有一定量种含视频信息之NALU,SPS与PPS,分别是班参数聚集和图像参数集,他们对此解码I、B、P片有举足轻重作用,没了当下有限种植NALU播放器是解码不生视频的,所以为了确保视频能正常解码,在打包TS流时,这半栽NALU被置于了I帧数据的眼前,它们是与I帧数据并为封装成PES包重分开成TS的,这与其它帧一个NALU对许一个PES包有所不同。

于分割视频的一个PES包时,TS头的continuity_counter价如果保连续,从0-15再三变化。它跟着上一致坏从88bf必发娱乐官网登入包视频帧时最后好TS包的coutinuity_counter价连续变。

3.6打包AAC音频帧

AAC的格式比较简单,它的单元以0xFFF做吧从始码,我们打包的就是一个以0xFFF开头的AAC单元。我的做法是一个AAC单元对应一个PES包,再划分成一个个TS包,这样做或有些浪费数据量,因为一个AAC单元相比一帧视频一经聊得多,在包成TS时,为了保障每个TS包都是188字节,在装载PES数据的末梢一个TS包时往往要增长填充字节,填充字节是加于由适应区底,由于一个AAC单元所载的数据量很有点,所以相比于看频帧来说,AAC单元的多寡多,那么最终由成的TS包就是包含比较多没用的填写充字节,浪费传输的拉动富,我看FFMPEG在打音频帧的时光是10基本上个AAC单元被同时保证改成一个PES包的,我莫懂得她这样由之规则,所以呢未尝因此,而且一个AAC单元对应一个PES包的做法实现起来比较简单并且播放器也能健康解码,所以即便动了这种打法。

打音频帧比视频帧简单多了,除了开头包之payload_unit_start_indicator要为1,以及coutinuity_counter值连续变外,没有别的要求,不过要要提示一点之凡coutinuity_counter价是接着上同样糟打包音频数据的coutinuity_counter来的。

3.7音视频同步

这个题材自己为当追着,所以自己这边不做证,只贴发出几单参考的链接,这些链接中蕴含了PTS与DTS的打法,但是尚未PCR的打法,我时即是看到频帧PES包之PTS直接就当TS包的PCR值了。

[TS流于包总结]

http://blog.csdn.net/yuan1125/article/details/51540918

[ffmpeg转码MPEG2-TS的音视频同步机制分析]

http://blog.chinaunix.net/uid-26000296-id-3483782.html

四、后记

这次学习打TS流的进程本身颇惬意,虽然花费的年华比较丰富,但马上也算得及我先是不善探究学习的涉吧,以前只要学一样东西,资料总是全的,看几乎眼睛就能懂个大致,因为凡当母校,有教材及导师领在,但这无非限于教材及的事物,在进社会行事晚,很多学问与技能都是未曾完备的科目的,即使发生,可能为未自然能够寻找得及。学习这些素材缺失失之知识是同一破探究学习的进程,因为材料稀缺,为了了解中一个知识面,不得不依靠搜索工具大量查看,在看了几十只网站终取得一致词话还是一个配之线索时,那时不得不说,我是惊喜和满足的,到最后我能自成一段落可以播放的TS流时,我觉着这五个月更增长吗值了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注