ts包中根据psi,pes等提取i帧
参考链接:
http://www.360doc.com/content/13/0829/15/13084517_310733557.shtml
http://www.360doc.com/showweb/0/0/834828238.aspx
https://zhidao.baidu.com/question/408735357.html
从mpeg ts文件中提取I帧(1):将ts包拼装为section或pes包
https://blog.****.net/maxzero/article/details/81202394
在哪个字段有判断I,B,P帧的信息
https://blog.51cto.com/2339637/1496497?utm_source=oschina-app
首先,解析TS流如何判断有效载荷数据是PES还是PSI
根据PID 判断
PID:
这个13b长度的字段,表示存储于传送包的有效净荷中数据的类型。PID=ox0000表示净荷的数据为节目关联表(psi pat);PID=0x0001表示净荷的数据为条件访问表;PID=0x0003~0x000F为保留;PID=0x1FFF表示净荷的数据空包;其他PID值表示净荷的数据为节目映射表,网络信息,以及由用户定义打包的音频/视频数据PES包等。
首先了解各种概念:
一、基本概念
1)ES
ES--Elementary Streams (原始流)是直接从编码器出来的数据流,可以是编码过的视频数据流(H.264,MJPEG等),音频数据流(AAC),或其他编码数据流的统称。ES流经过PES打包器之后,被转换成PES包。
ES是只包含一种内容的数据流,如只含视频或只含音频等,打包之后的PES也是只含一种性质的ES,如只含视频ES的PES,只含音频ES的PES等。每个ES都由若干个存取单元(AU)组成,每个视频AU或音频AU都是由头部和编码数据两部分组成,1个AU相当于编码的1幅视频图像或1个音频帧,也可以说,每个AU实际上是编码数据流的显示单元,即相当于解码的1幅视频图像或1个音频帧的取样。
2)PES
PES--Packetized Elementary Streams (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构。PES流是ES流经过PES打包器处理后形成的数据流,在这个过程中完成了将ES流分组、打包、加入包头信息等操作(对ES流的第一次打包)。PES流的基本单位是PES包。PES包由包头和payload组成。
3)PTS、DTS
PTS--PresentationTime Stamp(显示时间标记)表示显示单元出现在系统目标解码器(H.264、MJPEG等)的时间。
DTS--Decoding Time Stamp(解码时间标记)表示将存取单元全部字节从解码缓存器移走的时间。
PTS/DTS是打在PES包的包头里面的,这两个参数是解决音视频同步显示,防止解码器输入缓存上溢或下溢的关键。每一个I(关键帧)、P(预测帧)、B(双向预测 帧)帧的包头都有一个PTS和DTS,但PTS与DTS对于B帧不一样,无需标出B帧的DTS,对于I帧和P帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,所以一定要分别标明PTS和DTS。
4)PS
PS--Program Stream(节目流)PS流由PS包组成,而一个PS包又由若干个PES包组成(到这里,ES经过了两层的封装)。PS包的包头中包含了同步信息与时钟恢复信息。一个PS包最多可包含具有同一时钟基准的16个视频PES包和32个音频PES包。
5)TS
TS--Transport Stream(传输流)由定长的TS包组成(188字节),而TS包是对PES包的一个重新封装(到这里,ES也经过了两层的封装)。PES包的包头信息依然存在于TS包中。
TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的。PS包由于长度是变化的,一旦丢失某一PS包的同步信息,接收机就会进入失步状态,从而导致严重的信息丢失事件。而TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。因此在信道环境较为恶劣、传输误码较高时一般采用TS码流,而在信环境较好、传输误码较低时一般采用PS码流。
6)TS单一码流、混合码流
单一性:TS流的基本组成单位是长度为188字节的TS包。
混合性: TS流由多种数据组合而成,一个TS包中的数据可以是视频数据,音频数据,填充数据,PSI/SI表格数据等(唯一的PID对应)。
"PSI是对单一TS流的描述,是TS流中的引导信息" PSI信息由节目关联表PAT、条件接收表CAT、节目映射表PMT和网络信息表NIT组成。这些表会被插入到TS流中。PSI信息是对单一TS流的描述,它是TS流的引导信息;PSI信息指定了如何从一个携带多个节目的传输流中找到指定的节目(见Q1)。 下面给出的是节目引导信息(或称节目特定信息,PSI)的四个表结构。
虽然这四个结构可以视为简单的表,但事实上,它们被进一步划分为各个段,并插入到TS包中。
PAT解析 PARSINGOF PAT "PAT是机顶盒接收的入口点,是它获取数据的开始" 节目关联表PAT的意义在于,它描述了当前TS流中包含了哪些PID;只有根据获得的PID,用户才可以以此作为凭据找出其他表(如PMT表)及其信息。所以PAT是机顶盒接收的入口点,是它获取数据的开始;要保证一个TS流能被正常接收,则至少要有一个完整有效的PAT。 下面给出了PID字段的取值要求:
PAT的表结构分析 ANALYZEOF THE STRUCTUREOF PAT
首先,对PAT的表结构进行分析。下面给出了PAT表的基本结构:
节目关联段 Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释) program_association_section(){ table_id 8 uimsbf Section_syntax_indicator 1 bslbf 通常设为“1” "0" 1 bslbf Reserved 2 bslbf Section_length 12 uimsbf 见注释 transport_stream_id 16 uimsbf 见注释 Reserved 2 bslbf Version_number 5 uimsbf 见注释 Current_next_indicator 1 bslbf 见注释 Section_number 8 uimsbf 见注释 last_section_number 8 uimsbf 见注释 for(i=0;i<N;i++){ program_number 16 uimsbf 见注释 reserved 3 bslbf if(program_number == 0){ network_PID 13 uimsbf 见注释 } else{ program_map_PID 13 uimsbf 见注释 } } CRC_32 32 rpchof 见注释 }
这里我们注意关注五个字段: table_id(赋值):PAT的table_id应为0x00 transport_stream_id(传输流标志):用以标识来源于网络中任何其他复合流的TS流 program_number(节目号):规定program_map_PID可适用的节目。当值为0x0000时,其后的PID参照将是网络PID。它可以作为一个指示符号,例如用于广播通道。 network_PID(网络PID):仅当program_number为0x00时使用 program_map_PID(节目映射PID):据此找出相应的PMT表
PAT的实例分析 ANALYZEOF REAL EXAMPLE OF PAT
借助码流分析仪,我们可以很清楚地以实例的方式更加清晰地了解PAT的结构。下面给出的就是一个TS流的PAT分析情况:
根据上表可以看出,这个TS流里共有6套节目,其映射关系PID分别为0xc9、0xcb、0xce、0xcc、0xcd和0xca。(注:0xc9=201) 下面给出的是PMT的简单解析: 两相比较,可以很清楚地知道,PAT是如何锁定各个PMT的(每个节目都有一个自己的PMT)。
Q1:如何找到一个特定的节目? 1.已知节目名称(或id等信息) P248 首先要从节目关联表PAT中获取这个节目的节目映射表PMT的PID值,再从TS流中找出与此PID值相对应的节目映射表PMT;再从PMT中获取构成这个节目的基本码流的PID值,从而根据该PID过滤出相应的视频、音频和数据等基本码流。最后解码恢复为原始信号。 PMT解析 PARSINGOF PMT "PMT是连接节目号与节目元素的桥梁" 节目映射表PMT的意义在于,它给出了节目号与组成这个节目元素之间的映射;也就是说,PMT是连接节目号与节目元素的桥梁。我们知道,一个电视节目至少包含了视频和音频数据,而每一个节目的视音频数据都是以包的形式在TS流中传输的;所以说,一个TS流包含了多个节目的视频和音频数据包。要想过滤出一个TS流中其中一个节目的视频和音频,则需要知道这个节目中视频和音频的标识号PID。PMT表的作用就在于,它提供了每个节目视频、音频(或其他)数据包的PID。
PMT的表结构分析 ANALYZEOF THE STRUCTUREOF PMT
先给出PMT表的段结构: Syntax (句法结构) No. of bits(所占位数) Identifier(识别符) Note(注释) 这里着重介绍两个字段: elementary_PID:标识了该节目(program_number)携带的基本流的识别号PID stream_type:流类型,指出了PID为elementary_PID的基本流的类型
附:流类型取值说明
PMT的实例分析
首先,注意到这张PMT表的progam_number=0xc9,就是我们在上面解析PAT表得到的。 从上面可以知道,节目号为0xc9(即201)的节目有两个单元流:
elementary_PID和stream_type的意义在于,告知接收机基本流的类型和识别PID。要想获取这个节目的视频,只需要对PID为0x21的数据包进行过滤,并交由视频处理模块处理。下图所示(除了节目名称,还需要SDT表信息)即为PAT和PMT共同获取的信息。
上图给出了在一个TS流中PSI各表之间的联系。首先从PAT表出发,获取当前有哪些节目号(program_map_PID),再根据这些节目号找出program_number相同的PMT;获取到PMT后,即可根据elementary_PID和stream_type来确定要过滤哪些含有基本流的TS包,以及这些包里面是什么类型的数据。这样,机顶盒就可以过滤出相应的节目(视频和音频数据)来收看了。 |