首页 > 其他分享 >视频封装格式篇(TS)

视频封装格式篇(TS)

时间:2024-04-21 22:23:06浏览次数:28  
标签:封装 ts TS PES ES 格式 unsigned PAT

什么是TS?

TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts

TS的分层

TS文件分为三层,如下所示(可以倒序更好理解)

  • TS层(Transport Stream):在PES层基础上加入了数据流识别信息和传输信息

  • PES层(Packet Elemental Stream):在ES层基础上加入时间戳(PTS/DTS)等信息。

  • ES层(Elementary Stream):压缩编码后的音视频数据。

TS层

ts包大小固定为188字节,ts层分为三个部分:ts header、adaption field、payload。

  • ts header固定4个字节

  • adaption field可能存在也可能不存在,主要作用是给不足188字节的数据做填充。

  • payload是PES数据,或者PAT,PMT等。

  • ts Header+adaption field格式如下:

    pid决定了负载内容的类型,主要包括:PAT表,PMT表,视频流,音频流。常用的PID值:

调整字段

PAT表结构(指明PMT表的PID值)

typedef struct TS_PAT{
unsigned table_id :8//固定为0x00,表示该表是PAT
unsigned section_syntax_indicator:1//段语法标志,固定为1
unsigned zero                    :1//固定为0
unsigned reserved_1              :2//第一个保留位
unsigned section_length          :12//表示这个字节之后有用的字节数,包括CR0
unsigned transport_stream_id     :16//传输流的ID,区别于一个网络中其他多路
unsigned reserved_2              :2//第二个保留位
unsigned version_number          :5//表示PAT的版本号
unsigned current_next_indicator  :1//表示发送的PAT是当前有效还是下一个有效
unsigned section_number          :8//如果PAT分段传输,那么此值每次递增1
unsigned last_section_number      :8//最后一个分段的号码
for(int i = 0;i < N; i++)
{
  unsigned Program_number          :16//节目号
  unsigned Reversed_3              :3//保留位
  if(Program_number == 0)
  {
    Network_id                    :13//网络信息表NIT的PID
  }
  else
    Program_MAP_PID                :13//节目映射表的PID,每个 节目都有一个
  }
  unsigned CRC_32                :32//CRC32校验码
}TS_PAT

PMT指明音视频流的PID值

补充说明

  • 打包ts流时PAT和PMT表是没有调整字段的,不够的长度直接补0xff即可
  • 视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

PES层

  • PES(Packetized Elementary Stream,打包的ES),在ES层的基础上加入了时间戳(PTS/TDS)等信息。
  • ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头,如下图所示
  • PES packet length一指示PES包中跟随该字段最后字节的字节数。0值指示PES包长度 既末指示也未限定并且仅在这样的PES包中才被允许,该PES包的有效载荷由来自传输流包中所包含的视频基本流的字节组成。
  • PES结构如下:

标签:封装,ts,TS,PES,ES,格式,unsigned,PAT
From: https://www.cnblogs.com/doubleconquer/p/18101176

相关文章

  • P5897 [IOI2013] wombats
    MyBlogsP5897[IOI2013]wombats有点恐怖。首先\(R,C\)很不平衡,考虑用一棵竖着的线段树维护较大的\(R\)维,每个节点上需要存的是\(C\timesC\)的数组\(d\),\(d_{i,j}\)表示该节点的最上面一行第\(i\)个到最下面一行第\(j\)个的最短路。因为已经处理好了左右儿子内......
  • 基于事件驱动的测试框架ETS
    ETS(Event-drivenTestSystem)是一种基于事件驱动的测试框架,它可以用于自动化测试和软件质量保障。ETS的生命周期包括测试计划、测试设计、测试实现、测试执行和测试报告等阶段。本文将通过代码示例和图表的形式详细介绍ETS生命周期的各个阶段。测试计划在测试计划阶段,我们需要明......
  • Google XTS测试学习
    XTS是一个统称,包含VTS、CTS、GTS,如果是TV类型产品,还要做netflix认证,简称NTS,其余TS含义如下: CTS测试简介Android的CTS测试,意为兼容性测试;只有通过CTS测试的设备才有可能获得Android的商标和享受AndroidMarket的权限AndroidCTS通过运行和安装一系列dex和APK文件,通过模......
  • 前端【TS】03-typescript【基础】【Pinia】
    介绍 什么是PiniaPinia是Vue的专属的最新状态管理库,是Vuex状态管理工具的替代品 手动添加Pinia到Vue项目1.使用Vite创建一个空的TS+Vue3项目1npmcreatevite@latestvue-pinia-ts----templatevue-ts2.按照官方文档安装pinia到项......
  • 前端【TS】02-typescript【基础】【搭建Vite+Vue3+TS项目】【为ref标注类型】
    前置基于Vite创建Vue3+TS环境vite官方文档:https://cn.vitejs.dev/guide/vite除了支持基础阶段的纯TS环境之外,还支持Vue+TS开发环境的快速创建,命令如下:1npmcreatevite@latestvue-ts-project----templatevue-ts23//说明:41.npmcreatevite@lates......
  • electron-store会将数据保存为什么格式
    electron-store是一个用于Electron应用程序的轻量级、持久化数据存储库。它将数据以JSON格式保存到本地文件系统上。具体来说:数据结构:electron-store接受任何可序列化的JavaScript数据结构作为存储内容。这包括基本类型(如字符串、数字、布尔值)、数组、对象(包括嵌套对象......
  • NanoPi-NEO 全志H3移植Ubuntu 22.04 LTS、u-boot、Linux内核/内核树、mt7601u USB-Wi-
    前言想在NanoPi-NEO上开发屏幕驱动,但是看了下文件目录发现没有内核树,导致最基础的file_operations结构体都无法使用,于是寻找内核树安装方法。但官方提供的内核为4.14太旧了apt找不到对应的linux-source版本(其实后面发现不需要用apt,可以在kernel.org上下载,但反正都装了那就当学习......
  • .Net与AI的强强联合:AntSK知识库项目中Rerank模型的技术突破与实战应用
        随着人工智能技术的飞速发展,.Net技术与AI的结合已经成为了一个新的技术热点。今天,我要和大家分享一个令人兴奋的开源项目——AntSK,这是一个基于.net平台构建的开源离线AI知识库项目。在这个项目中,我们最近加入了一项强大的Rerank(重排)模型,进一步增强了我们的AI知识库的......
  • ConvertLatOrLonFilter-经纬度格式转换-保留6位
    ConvertLatOrLonFilter-经纬度格式转换-保留6位/***转换经纬度*小数点最后最多为6位*@paramlatOrLon*@return*/privateStringconvertLatOrLon(StringlatOrLon){if(org.apache.commons.lang.StringUtils.isNotBlank(latOrLo......
  • vue中ts引入组件,无法找到模块xxx的声明文件。xxx隐式拥有 "any" 类型。
    原因说明简单来说就是ts不认识.vue这个类型,需要定义声明。我刚学ts不是很懂为什么vite官方内写了那么多类型声明就是不写.vue。解决方法在项目根目录下找到env.d.ts文件,这个文件定义类型声明,简单地说就是让ts认识各种类型,尤其是文件。那么解决方法显而易见,我们自定义vue的......