在MPEG-2标准中,有两种不同类型的码流输出到信道:一种是节目码流(Program Stream, PS),适用于没有误差产生的媒体存储,如DVD等存储介质;另一种是传送流(Transport stream, TS),适用于有信道噪声产生的传输,目前TS流广泛应用于广播电视中,如机顶盒等。

一、基本概念

  ES流(Elementary Stream):基本码流,可以理解为编码后的裸数据;

  PES流:分割打包的ES流,加入了PES头。PES包是可变长度的,PES头中最重要的部分是显示时间标记(Presentation Time Stamp, PTS)和解码时间标记(Decode Time Stamp, DTS),有了PTS和DTS,再加上节目时钟参考PCR,解码器就能从TS流中重建视频流;

  TS流(Transport Stream):传输流。固定包长度为188B,TS流固定包长度的好处是便于找到帧的起始位置,易于从包丢失中恢复,适合于有误码的环境。

二、TS流格式

2.1 TS流格式

  TS header是4byte,分别是1byte的同步字节,1bit传输数据包差错指示, 1bit净荷单元起始指示, 1bit传送优先权, 13bit包标识符PID, 2bit传送加扰控制,2bit调整字段控制和4bit连续计数器。

同步字节(sync byte): 1B,其值固定为0x47,该字段是MPEG-2 TS传送包标识符;

  传输误差指示符(transport error indicator): 1bit,其值为1时,表示在相关的传送包中至少有一个不可纠正的错误位,只有在错误纠正之后,该位才能被重新置0;

  有效载荷单元起始符(payload unit start indicator): 1bit, 当TS包带有PES包数据时,置为1,表示TS包的有效净荷以PES包的第一个字节开始;置为0,表示该TS包的开始不是PES包;当TS包带有PSI数据时,置为1,表示TS包带有PSI部分的第一个字节,即第一个字节带有指针pointer_field;置为0,表示TS包不带有一个PSI部分的第一个字节,即有效净荷中没有指针pointer_field。空包时,该位置为0;

  传输优先级(transport_prority): 1bit, 置为1,表示相关的包比其他具有相同PID,但是此字段置0的包有更高的优先级;

  PID: 13bit, 表示传送包的有效净荷中的数据的类型。具体如下表:

PID取值 

PID值使用描述

0x0000

节目关联表(program association table, PAT)

0x0001

条件访问表(conditional access table, CAT)

0x0002

传送流描述表(transport stream description table, TSDT)

0x0003~0x000F

保留

0x0010~0x1FFE

可以分配为network PID, Program map PID,  elementary PID, 或其它

0x1FFF

空包(8191)

  PID信息非常关键,它直接表征本次TS包的用途。比较重要的是PAT和PMT,之后会有说明;

  传输加扰控制(transport scrambling control): 2bit,该字段用来指示传送流包有效净荷的加扰方式;

  自适应字段控制(adaption field control): 2bit,表示传送流包首部是否跟随有调整字段和/或有效净荷。具体如下表:

调整字段值

描述

00

保留

01

没有调整字段,仅含有184B长度的有效净荷

10

没有有效净荷,仅含有183B长度的调整字段

11

0~182B的调整字段后为有效净荷

  连续计数器(continuity counter): 4bit,随着具有相同PID TS包的增加而增加,达到最大则恢复为0.

2.2 TS流调整字段

  在MPEG-2 TS中,为了传送打包后长度不足188B的不完整TS,或者为了在系统层插入节目时钟参考(program clock reference, PCR),需要在TS包中插入可边长字节的调整字段。调整字段其中一个重要作用是解决编解码器的音视频同步问题。一般在视频帧中的TS包的调整字段中,每隔一定传输时间,传送系统时钟27MHz的一个抽样值给接收机,作为解码器解码时的时钟参考信息PCR。PCR通常每隔100ms至少被传输一次。PCR的数值所表示的是解码器在读完这个抽样值的最后那个字节时,解码器本地时钟所应处的状态。通常情况下,PCR不直接改变解码器的本地时钟,而是作为参考基准来调整本地时钟,使之与PCR趋于一致。

2.3 PES包格式

  PES包的第5个字节标识一整个PES包的长度,一般来说,一个PES包包含一帧图像,获取了PES的包长度Len,当接收到Len个字节后,将接收到的字节组成一个block,放入FIFO中,等待解码线程解码。DTS和PTS也在PES包中传送。

三、节目专用信息(Program Special Information, PSI)

  前边提到了PAT和PMT,它们都是PSI之一。MPEG-2 TS传送TS包,这些包携带两类信息:已压缩的音视频(PES)和与之相关的符号化表(PSI),由传送包的PID来识别。

3.1 节目关联表(Program Association Table, PAT)

  PAT定义了TS中的所有节目,其值为0x0000,是PSI信息的根结点。其格式如下图。

  上图中,程序在解析到N环部分的时候,会读取并保存节目列表及其PID。PAT信息在TS流中隔一段时间就会传送,接收机在接收时,以接收PAT表为起始。PAT表列出了TS流中所有的节目列表,以及节目对应的PID值,这个PID值表征的是该节目对应的PMT表的PID值(PMT表稍后说明)。PAT表与PMT的关系如下图。

3.2 节目映射表(Program Map Table, PMT)

  PMT提供一路节目包含的所有原始码流的PID映射表,其格式如下图。

  程序在读取N环的时候会读取该节目所有的码流列表及其PID,解析的时候可以根据PID来分离。这N环描述符包括的信息如下图所示。节目时钟参考PCR的PID和视频的PID是相等的。由PAT得出所有的节目列表,选定收看的节目后,筛选出等于该节目PID的TS包,就可以得到该节目的所有码流的PID映射表,这样接收机就可以只接收PID等于该节目的码流的TS包即可收看该节目。

 四、音视频同步

  前边介绍的是TS流用的最多的格式,以及PAT和PMT等,现在说一下TS流在解码时是如何做到音视频同步的。

4.1 时间标记与PTS和DTS

  时间标记本身是以90KHz单位表达的33bit二进制值,是MPEG-2系统层提供的一种机制,以便确保在解码器上相关的原始流之间正确的同步。时间标记有两类:一个是解码时间标记(DTS,Decode Time Stamp), 它规定了在某时间应该从解码器缓冲区中删除一个访问单元并解码,但是不进行播放;另一个是显示时间标记(PTS,Present Time Stamp),它规定了在某时刻,解码的图像最后从临时缓存中释放出来并进行播放。这样PTS将总是比与之相关的DTS大。

4.2 音视频同步

  在MPEG-2编码器中有一个系统时钟,该系统时钟用来生成一个共同的时序以便音视频能够正常的解码与播放。因为编码器有共同的系统时钟STC,解码器中的时钟可以根据PCR重新恢复。所以端到端的同步分为以下几个步骤:

(1) 解码器接收到PCR时,恢复系统时钟;

(2) 解码器接收到PTS/DTS时,存入对应的堆栈;

(3) 每幅图像解码前,用其对应的DTS与系统时钟STC进行比较,当两者相等时,就开始解码;

(4) 每幅图像播放前,用其对应的PTS与系统时钟STC进行比较,当两者相等时,就开始播放。

  实际应用时,解码器一般都有自主的系统时钟频率,不能直接拿编码器的PCR设置为解码器的系统时钟STC,而是利用接收到的PCR值,通过锁相环PLL校正解码器的系统时钟STC。

  VLC调试接收TS流的代码分析见链接:vlc源码分析(四) 调用libts接收TS流,对理解上述过程非常有帮助。

TS流基本概念的更多相关文章

  1. vlc源码分析(四) 调用libts接收TS流

    代码分析前,先要了解TS流基本概念:TS流之基本概念. VLC解析TS流是通过libts库来分离的,libts库使用libdvbpsi库来解TS表.VLC使用模块加载机制来加载libts库,具体调用的 ...

  2. TS流格式(转)

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  3. TS流PAT/PMT详解

    一 从TS流开始 从MPEG-2到DVB,看着看着突然就出现了一大堆表格,什么PAT.PMT.CAT……如此多的表该怎样深入了解呢? 我们知道,数字电视机顶盒接收到的是一段段的码流,我们称之为TS(T ...

  4. TS流解析 三

    应该说真正了解TS,还是看了朋友推荐的<数字电视业务信息及其编码>一书之后,MPEG2 TS和数字电视是紧密不可分割的,值得总结一下其中的一些关系. ISO/IEC-13818-1:系统部 ...

  5. TS流解析 一

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  6. MPEG2 PS和TS流格式

    http://blog.csdn.net/alangdangjia/article/details/9495193 应该说真正了解TS,还是看了朋友推荐的<数字电视业务信息及其编码>一书之 ...

  7. TS流分析

    http://blog.csdn.net/zxh821112/article/details/17587215 一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transpor ...

  8. 从TS流到PAT和PMT

    转自:https://blog.csdn.net/rongdeguoqian/article/details/18214627 一 从TS流开始 最近开始学习数字电视机顶盒的开发,从MPEG-2到DV ...

  9. TS流解析 四

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

随机推荐

  1. slider轮播插件的多种写法

    slider轮播插件相信大家经常会用到,写法也是各种各样,大部分都是用的第三方提供的组件使用,如果想基于自己的业务特点封装个组件供自己使用的话就要自己封装组件了,网上看了大部分写法都是通过js控制do ...

  2. json格式对象大括号中不能把键改为变量问题

    今天遇到了一个往json中写入变量的问题,下面代码是错误的写法 document.querySelector(".box").onclick = function(){ // 移动 ...

  3. webapi views目录下html文件无法访问

    找到views下web.config 增加如下红色标注内容 <?xml version="1.0"?> <configuration> <config ...

  4. YC

    package com.hanqi; import java.util.*; public class yc{ public static void main(String[] args) { // ...

  5. Mac系统操作指南

    OSX 采用的Unix文件系统,所有文件都挂在跟目录“ /” 下面,所以不在要有Windows 下的盘符概念.比如什么“C:”你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做“XX” ...

  6. 毕向东_Java基础视频教程第19天_IO流(15~17)

    第19天-15-IO流(读取键盘录入) InputStreamReader是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符.它使用的字符集可以由名称指定或显式给定,或者可以 ...

  7. 打印 1 到最大的 n 位数(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数. ...

  8. C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    如何:对 Windows 窗体控件进行线程安全调用 访问 Windows 窗体控件本质上不是线程安全的. 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能会出现 ...

  9. js实现查找字符串出现最多的字符和次数

    代码如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...

  10. .net core系列之《.net平台历程介绍以及.net framework和.net core对比》

    一..Net平台的背景 1.2010之前 的PC时代的时候,互联网规模还不是特别庞大,以静态编译式语言为代表的JAVA和.Net没什么太大区别,.net以windows自居. 2.2010年以JAVA ...