一、复合流的概念,什么是复合流?
复合流简单地说,就是一条流包含视频和音频。如果一条流只包含音频或者视频的话,我们称之为裸流,比方说H264裸流、aac裸流等。在音视频中,TS流(全称是:MPEG2-TS)是一种常用的复合流(目前属于最常见的复合流)。几乎所有的流媒体协议都支持TS流,如:RTSP、UDP、SRT等等(RTMP属于FLV流媒体协议,下一篇会详细介绍)。
二.TS流的结构介绍:
2.1.TS流支持的三层结构:
他分别是:
- Transport Stream层
- Pes层(Packet Element Stream)
- ES流层(Elementary Stream)
2.2.Transport stream层的讲解:
TS层的大小固定在188个字节,并且TS内部也分成三个部分:分别是TS Header、Adaptation Field、Payload。其中TS Header指的是TS的头部,固定四个字节。Adaptation Field没有特别的意义,主要是补充188个字节的。payload指的是pes的具体数据。
- TS头部的结构:
- Adaption的结构:
Transport stream层的主要内容包括了:PAT表、PMT表、音频流、视频流。PAT表的主要功能是通过PMT找到对应的音视频流。PAT表的PID值一般为0,而PAT和PMT需要不定时插入TS流。所以,我们总结一下PAT表、PMT表的具体作用:
- PAT表:最主要功能是通过此表找到PAT表的PID值,下面这个是PAT表的内容
- PMT表:最主要功能是找到音视频的PID值,下面是PMT表的具体内容
- 音视频流:就是用户插入的具体音视频数据
2.3.PES层结构的讲解:
我们介绍完Transport Stream层之后,我们再来看看PES层的内容。PES层的主要功能是在每一个音视频流上添加时间戳。这就是我们经常在ffplay或者vlc播放器看到有PTS、DTS的信息。我们先来看看PES的结构:
PTS指的是显示时间戳,DTS指的是解码时间戳。在绝大部分情况下,PTS和DTS的值都是相同的,但如果编码器引入B帧的话,PTS和DTS就要根据B真的间隔去计算DTS。
音频的PTS则永远等于DTS
2.4.ES层结构的讲解:
ES层就是我们常说的视频裸流,音频裸流。比方说:H264/HEVC码流 AAC码流。在TS流的ES层里面,所有的视频裸流和音频裸流都需要进行打包操作。比方说以H264码流为例,所有的H264裸流都遵循NALU格式,这其中包括SPS、PPS、I帧。
这里由于是ES流的结构,在上一几篇文章已经介绍过了,所以这里不做过多介绍