首页 > 编程知识 正文

ts格式转换器,常见的视频封装格式

时间:2023-05-05 20:22:45 阅读:107346 作者:3600

TS基础知识TS packet大小TS封装流程PES packet内部结构键字段TS packet内部结构键字段PSI/SIPAT内部结构映射键字段PMT内部结构键字段在实际使用中遇到的问题

基础知识流(Elementary Stream ) :

基本码流,未分段的音频、视频或其他信息的连续码流。 PES流(Packeted Elementary Stream ) :

的基本码流打包,将基本码流(ES )划分为段,加入头信息打包而成。 PS流(Program Stream ) :

节目流是将具有共同时间基准的一个或一个以上PES组合并封装的单个数据流。 PS包的长度不是一定的。 TS流(Transport Stream ) :

传输流是由一个或多个具有公共或独立时间基准的PES复合而成的单个数据流。 TS包的长度是固定的。 注意: TS流比PS流更能抗传输错误。 由于TS分组具有固定长度,如果一个TS分组的同步信息被破坏,则接收机能够检测到TS分组后面的同步位置以恢复同步。 PS流无法确定下一个PS packet的同步位置,从而导致失调。 ts包的大小

TS Packet有四种大小。

188 bytes:MPEG-2标准大小192 bytes:188 bytes 4 bytes时间码---日本DVH-S标准204 bytes:188 bytes 16 bytes前向纠错码(FEC(-美国ATSC标准208 bytes

注意:

如果一个pes packet打包在多个ts packet中,则同一pes的ts packet将排列在一起。 sps和pps的nalu通常与I frame nalu封装在同一个pes packet中。 也就是说:

PES packet内部结构

密钥字段Packet start code prefix :

页眉的起始代码。0x00 00 01,固定为占位符24bit,用作pes packet的分隔符。 流id :

pes软件包中的负载流类型。 例如,音频流:0xc 0至0x df,视频流:0x E0至0x ef。 典型的音频为0xC0,视频为0xE0

注: packet start code prefix stream id的4个字节称为pesstartcode(pes开始代码),用于标识pes packet的开始。 总共4个字节。

其音频开始代码为0x 00 00 01 C0,视频开始代码为0x 00 00 01 E0PES packet length :

pes数据包的长度占用16位,包括此字节后的可选标头和负载长度。 因此,PES数据包的最大负载长度为65535字节,如果一帧的数据超过65535,则它将被分成多个PES。 此字段可以设置为0。 这表示pes packet是任意长度,只有在es data为video时才能将其设置为0。 pespacketlength=(2bytes flag1bytepesheaderlength (pesheaderdatalengthnbytespayload-- n (payloadsize ) ) ) ) PTS/DTS flag :

pts和DTS标志位,占位符2位。 10b :存在pts字段; 11b )有PTS和DTS字段; 00b :都没有。

1 PTS/DTS flag=10b

2 PTS/DTS flag=11b

这里,需要注意的是pts和dts的单位是timescale。 由于ts进行封装时基准时钟频率为90KHz,所以1 timescale=1/90 000 s=1/90ms,因此为了将dts/pts变换为毫秒,乘以1/90、即pts/90 ms

密钥字段同步字节:

同步字节。 固定为0x47。 传输错误指示器:

传输错误指示位。

1: packet至少有一个不可纠正的错误位

0:无错误位。 Payload unit start indicator:

称重传感器开始指示位。 很重要! )

1:该packet是PES或PSI的第一个ts分组;

0:不是。

对于PSI包,payload的第一个字节是pointor field,因此PSI的有效字节从payload的第二个字节开始。 传输优先级:

传输优先级,表示在同一位置

PID的packet中,该packet优先级更高。(比如说I frame packet?)PID :
–>packet的ID号。
Transport scrambling control :
–>传输加扰控制位,指示packet有效净载的加扰方法。

注意:以上加扰的类型为DVB-CSA和ATSC DES。Adaptation field control :
–>自适应调整域控制位,一般是PCR相关的信息。
Coutinuity counter :
–>连续计数器。随着具有相同PID的packet增加而增加,最大为15,达到最大重置为0。
如果两个连续相同PID packet具有相同的计数,则表明两个包是一样的,应将其丢弃。Adaptation field length:
–>自适应调整域的长度。 PSI/SI PSI
Program Specific Information, 节目引导信息,在MPEG-2标准中定义的。SI
Service Information, 业务信息,在DVB标准中定义的。常见的有:
PAT

Program Association Table,节目关联表,是接收数据的入口点,解析TS的起点。

内部结构图

关键栏位 table id:
–> 对于PAT来说,table id固定是0x00。
Section syntax indicator:
–>对于PAT来说,置为’1’Section length:
–>分段长度。表示从section length(包括在内)到CRC_32字段的字节数,不超过1021。前面两位固定为’00’Transport stream id:
–>传输流标识号。用来表示来源于网络中任何其它复合流的TS流。Version number:
–>PAT版本号,如果PAT有变,则版本号加1Current next indicator:
–>1,当前表有效;0,当前表无效,下一个表才有效。Section number:
–>分段号。表示当前packet属于PAT的第几个分段,第一个分段为0x00。Last section number:
–>PAT最后一个分段号。Program number:
–>节目编号。Network pid:
–>NIT表的PID。Program map pid:
–>PMT 的PID值。据此找出响应的PMT表。 PMT

Program Map Table,节目映射表。连接节目号和节目元素的桥梁。

内部结构

关键栏位 Table ID:
–>由PAT确定。Version number:
–>PMT版本号,如果PMT有变,则版本号加1PCR_PID:
–>包含PCR信息的packet PID。Program info length:
–>节目信息长度。紧跟在其后的就是节目信息。Stream type:
–>节目流编解码类型。
MPEG-2是0x02,H264一般是0x1b,AAC是0x0f,H265是0x24。
具体如下图:
Elementary PID:
–>基本码流的PID。Es info length:
–>前两个字节为’00’,紧跟其后的就是基本码流信息。 实际应用遇到的问题

一个PES packet只有一帧?
–>
不是的,因为一个PES packet最大长度时65535,所以如果一帧大于65535的话,将会被分为几个pes packet。

如何从ts packet解析出一个完整的pes packet?
–>
首先对于一系列ts packet,判断其header中payload_unit_start_indicator flag,如果是1;
再判断ts payload,看看其前三个字节是不是0x 00 00 01,
如果都满足的话,那说明是pes开头。从这个ts packet开始将payload放到 pes buffer中。

如何区分audio pes packet和video pes packet?
–>
a. 从PMT中可以parse出audio packet pid和video packet pid,从而可以区分出audio ts packet和video ts packet,解封装出来的pes packet类型自然可以知道。
b. 看pes packet start code,start code 为0x 00 00 01 C0,那就是audio pes packet;start code为0x 00 00 01 E0,那就是video pes packet。

如何获得duration?
–>
1> 从Downloader获取duration(有的网络协议里面会带有duration信息,比如rtsp)
2> 分别获取第一个video pes packet和最后一个audio pes packet的pts,相减后得到duration。
3> 根据码流比特率和文件大小计算duration。
4>获取码流最后一个PVR time code,经过单位换算后得到duration。

网络播放中,如何获得ts的duration?
–>
Player首先从range为0发起一次请求,从响应报文中识别出content-length字段,得到ts文件大小filesize,并解析出PAT、PMT和第一个video pts,
然后关闭http连接,再发起一次请求,range = filesize - 4096,从服务器返回的数据中解析最后一个video pes packet的pts,
如果没有找到video pts,就以range=filesize - 4096 * n (n =1, 3, 6, 10, 15 … ) 继续请求,
直到parse到最后一个video pts为止,然后duration就是最后一个video pts减去第一个video pts。

对于TS,为什么ES要经过两次封包?
–>
ES–>PES:对ES进行打包和加入包头信息等操作,为码流复合做准备。
PES–>TS:将音频视频和其它数据进行复合,并打包为固定大小的packet,在丢包之后,能够及时纠正并同步,使之具有很强的抵抗传输误码的能力。

如何probe一个文件为TS文件?
–>
数据流开头2048字节中出现0x47与0x47之间的间隔为{188, 192, 204, 208}之一,并且连续出现8次,则说明该码流是TS。

如何知道当前码流中的audio和video的codec type?
通过parse audio 和video descriptor tag的stream type filed,在DVB标准中,H264一般是0x1b,adts AAC是0x0f,H265是0x24。
(player完全信任该filed,如果码流标错的话,就gg)

PES header中start code prefix为0x 00 00 01,跟H.264流中的start code prefix相同,如何区分?
–>
通过ts packet的负载起始标志位(Payload unit start indicator)来识别出pes packet的第一个ts packet,而PES Header一定在第一个ts packet中。
还有就是stream id的的最高位是1,而h264 header的最高位是0,通过这点也可以将二者分辨出来。

怎么获得ts码率?
–> (reverse…)

怎么做seek?
–> (reverse…)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。