zoukankan      html  css  js  c++  java
  • 关于ES、PES、PS及TS码流

    IP数据报有首部和数据两部分组成的,首部的前一部分是固定长度20字节,是所有IP数据报必须具有的。首部包括:总长度、标识、MF、DF、片偏移。

    一. 基本概念

    数字信号实际传送的是数据流,一般数据流包括以下三种:

    (1)ES流(Elementary Stream):

    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流(Packet Elementary Stream):

    PES--Packetized Elementary Streams (分组的ES), 也叫打包的基本码流,是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。ES形成的分组称为PES分组,是用来传递ES的一种数据结构。PES流是ES流经过PES打包器处理后形成的数据流,在这个过程中完成了将ES流分组、打包、加入包头信息等操作(对ES流的第一次打包)。PES流的基本单位是PES包。PES包由包头和payload组成

    (3)PS流(Program Stream):

    PS--Program Stream(节目流), PS流由PS包组成,而一个PS包又由若干个PES包组成(到这里,ES经过了两层的封装)。PS包的包头中包含了同步信息与时钟恢复信息。一个PS包最多可包含具有同一时钟基准的16个视频PES包和32个音频PES包。

    (4)TS流:

    TS--Transport Stream(传输流),也叫传输流,由定长的TS包组成(188字节),而TS包是对PES包的一个重新封装(到这里,ES也经过了两层的封装)。PES包的包头信息依然存在于TS包中。TS流是由固定长度为188字节的包组成,含有独立时基的一个或多个program, 一个program又可以包含多个视频、音频、和文字信息的ES流;每个ES流会有不同的PID标示. 而又为了可以分析这些ES流, TS有一些固定的PID用来间隔发送program和ES流信息的表格: PAT和PMT表。适用于误码较多的环境。

    TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的。PS包由于长度是变化的,一旦丢失某一PS包的同步信息,接收机就会进入失步状态,从而导致严重的信息丢失事件。而TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。因此在信道环境较为恶劣、传输误码较高时一般采用TS码流,而在信环境较好、传输误码较低时一般采用PS码流。

    (5)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。

    (6)TS单一码流、混合码流

    单一性:TS流的基本组成单位是长度为188字节的TS包。
    混合性: TS流由多种数据组合而成,一个TS包中的数据可以是视频数据,音频数据,填充数据,PSI/SI表格数据等(唯一的PID对应)。

    二. 基本流程

    1)A/D转换后,通过MPEG-2压缩编码得到的ES基本流。这个数据流很大,并且只是I,P,B的这些视频帧或音频取样信息。

    2)通过PES打包器,打包并在每个帧中插入 PTS/DTS标志,变成PES。原来是流的格式,现在成了数据包的分割形式。

    3)PES根据需要打包成PS或TS包进行存储(DVD)或传输(DVB)。因每路音/视频只包含一路的编码数据流,所以每路PES也只包含相应的数据流。

    附:PS流的组成

     关于PID的解释:

    PID(PacketIdentifier)是包识别码的意思。

    TS包头占用TS包的前4个字节,其中用13bit来表示PID。

    PID的作用就好比是一份文件的文件名。有了标识值的TS包,会放进一个叫节目映射表(PMT)的控制信息中,PMT本身就是一个TS包,所以也有自己的PID值(有PAT包指定),这个表里面的PID值与该路节目ES的音频、视频、数据的PID一一对应。最后将与该路节目有关的传送包复接起来,共同形成单路节目传送流,即TS流,从上图可以看出,视频数据的PID值是45,音频数据的PID值是78,填充数据的PID值是69...。

    在多路节目传送流中,还有一个特殊的控制信息PAT(它是节目辅助表的意思),PAT本身也是一个TS包(在ISO/IEC 13818-1里有说明,PAT(Program Association Table)的PID值为0x00,所有TS包的标识(即sync_byte)为0x47),即上图中的表格数据部分。在PAT中,包含的就是每路TS流对应的PMT表所在的TS包的PID信息,其实PAT表中的数据为TS包的PID,这个TS包的内容为PMT。

    通过对PID的译码,就可以对单个节目传送流进行解码。

    所以解析起来就像这样: 先接收一个负载为PAT的TS包(TS包头为0x47 0xXX 0x00 0xXX),在整个数据包里找到一个PMT包的PID(program_map_PID)。然后再接收一个含有PMT的TS包(TS包头为0x47 0x00 program_map_PID 0xXX),在这个TS包里找到有关填入数据类型的PID,PMT中可能含有不止一个TS包的PID数据,PMT中stream_typeelementary_PID决定了TS包的类型和PID,然后用PMT中的PID值匹配接收到的TS包,如果匹配上,那么该TS包的负载内容就是填入实际的数据。

    转自:http://www.360doc.com/content/13/0829/15/13084517_310733557.shtml

    三. 总结:

    ES是原始码流,包含视频、音频或数据的连续码流。

    TS是传输流,是由固定长度为188字节的包组成,含有独立时基的一个或多个节目,适用于误码较多的环境。 在MPEG-2系统中,由视频,音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流。

    PES是打包生成的基本码流,是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。

    PS是节目流,PS主要应用于存储的具有固定时长的节目,如DVD电影,而TS则主要应用于实时传送的节目,比如实时广播的电视节目,PS流不能独立解码,而后者可以独立解码;PS流的包结构是可变长度的,而TS流的包结构是固定长度的。

    编码器出来的是TS流,传输接口为asi口,编码器整个作用过程是把模拟信号变成ES,再打包成PES,再打包成TS流输出。

    复用器是把多路单节目或多节目TS流合称1路多节目TS流,再给调制器。

    数字卫星接收机出来的是TS流,也是asi接口,可能包含一路或多路节目,有的还同时有一路模拟信号视音频输出。

    模拟卫星接收机出来的是模拟视音频信号。

    参考链接:

    1. ES vs PS vs PES vs TS码流分析

    2. 关于ES、PES、PS以及TS码流

    3. 流媒体基础知识TS流 PS流 ES流区别

  • 相关阅读:
    友链
    利用jenkins插件查看allure报告
    python pyyaml操作yaml配置文件
    数组类型
    接口测试--加密算法
    python赋值,深拷贝和浅拷贝的区别
    RF中在测试用例集上设置标签
    python中json.dump()与json.dumps()的区别
    python 日期与字符串之间的转换
    python operator操作符函数
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/13141213.html
Copyright © 2011-2022 走看看