TS解析文档

TS格式解析

简介:

ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。
ts的包是一个一个188字节的包组成,这188字节里面由一个0x47开头的包作为同步。
也就是说,如果你找到了0x47,如果与它相隔188个字节的地方又是一个0x47,基本上就是一个ts的包。
注:ts包中有内容为0x47,所以分割时确定是ts包之后,直接以188字节分割。

结构:

ts文件分为三层:ts层Transport Stream:ts层就是在pes层加入数据流的识别和传输必须的信息。pes层 Packet Elemental Stream:pes层是在音视频数据上加了时间戳等对数据帧的说明信息。es层 Elementary Stream.:es层就是音视频数据。

在这里插入图片描述

解析步骤

  • ts流 发送方式:->PAT ->PMT ->PES ->ES ->ES ->ES ->ES ->PES -> ES ->ES …
ts层的内容是通过PID值来标识的,内容:PAT表、PMT表、PES包、ES(音频、视频)。(注:只有PES包有pes header)
解析ts流要先找到PAT表,找到PAT就可以找到PMT的PID,然后根据PMT的PID找到PES包,之后的为前一个PES包的补充ES数据。PAT表的table_id值固定为0x00。
PMT表的table_id值固定为0x02。
PES包的开始码固定为0x000001。
ES包,开始即为数据,没有固定值。

ts header

ts层分为三个部分:ts header:固定4个字节。adaptation field:可有可无,作用是给不足188字节的数据做填充。payload:pes数据。

ts header:详解如下:

字段长度(bite)描述
sync_byte8b固定为0x47
transport_error_indicator1b传输错误指示符,表明在ts头的adapt域后由一个无用字节,通常为0
payload_unit_start_indicator1b负载单元起始标示符,
transport_priority1b传输优先级,0为低优先级,1为高优先级,通常取0
pid13bpid值
transport_scrambling_control2b自适应区,‘00’保留;‘01’为无自适应域,仅含有效负载;‘10’为仅含自适应域,无有效负载;‘11’为同时带有自适应域和有效负载。(自适应域:adaptation field)
adaptation_field_control2bpid值
continuity_counter4b递增计数器,从0-f,起始值不一定取0,但必须是连续的
注:payload_unit_start_indicator:为1时:表明是第一个的数据包 (后面有pes层),为0时:表明不是第一个数据包,后面直接是数据

adaptation field

adaptation field:详解如下:

字段长度(字节)描述
adaptation_field_length1B自适应域长度,后面的字节数
flag1B取0x50表示包含PCR或0x40表示不包含PCR
PCR5BProgram Clock Reference,节目时钟参考,用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。
stuffing_bytesxB填充字节,取值0xff

PAT 格式

字段长度(bite)描述
table_id8bPAT表固定为0x00
section_syntax_indicator1b固定为1
zero1b固定为0
reserved2b固定为11
section_length12b后面数据的长度
section_length16b传输流ID,固定为0x0001
reserved2b固定为11
version_number5b版本号,固定为00000,如果PAT有变化则版本号加1
current_next_indicator1b为1,表示这个PAT表可以用,为0则要等待下一个PAT表
section_number8b固定为0x00
last_section_number8b固定为0x00
program_number16b节目号为0x0001时,表示这是PMT
reserved3b固定为111
PID13b节目号对应内容的PID值
CRC3232b前面数据的CRC32校验码

注:ts header之后,PAT表之前有1字节无用,需要排除

PMT格式

字段长度(bite)描述
table_id8bPAT表固定为0x02
section_syntax_indicator1b固定为1
zero1b固定为0
reserved2b固定为11
section_length12b后面数据的长度
section_length16b频道号码,表示当前的PMT关联到的频道,取值0x0001
reserved2b固定为11
version_number5b版本号,固定为00000,如果PMT有变化则版本号加1
current_next_indicator1b为1,表示这个PMT表可以用,为0则要等待下一个PAT表
section_number8b固定为0x00
last_section_number8b固定为0x00
reserved8=3b固定为111
PCR_PID13bPCR(节目参考时钟)所在TS分组的PID,指定为视频PID
reserved4b固定为1111
program_info_length12b节目描述信息,指定为0x000表示没有
stream_type8b流类型,h.264编码对应0x1b,aac编码对应0x0f,mp3编码对应0x03,h.265编码对应0x24
reserved3b固定为111
elementary_PID13b与stream_type对应的PID
reserved4b固定为1111
ES_info_length12b描述信息,指定为0x000表示没有
CRC3232b前面数据的CRC32校验码

注:ts header之后,PMT表之前有1字节无用,需要排除

PES格式

字段长度(字节)描述
pes_start_code3B开始码,固定为0x000001
stream_id1B音频取值(0xc0-0xdf),通常为0xc0;视频取值(0xe0-0xef),通常为0xe0
pes_packet_length2B后面pes数据的长度,0表示长度不限制,只有视频数据长度会超过0xffff(注:长度为整个pes,即为第一个pes头、es+之后的es)
flag1B通常取值0x80,表示数据不加密、无优先级、备份的数据
flag1B取值0x80表示只含有pts,取值0xc0表示含有pts和dts
pes_data_length1B后面数据的长度,取值5或10
pts5B33bit值
dts5B33bit值
注: pts是显示时间戳、dts是解码时间戳,视频数据两种时间戳都需要,音频数据的pts和dts相同,所以只需要pts。
有pts和dts两种时间戳是B帧引起的,I帧和P帧的pts等于dts。如果一个视频没有B帧,则pts永远和dts相同。从文件中顺序读取视频帧,取出的帧顺序和dts顺序相同。
dts算法比较简单,初始值 + 增量即可,pts计算比较复杂,需要在dts的基础上加偏移量。

ES格式

视频数据必须加上一个nalu(Network Abstraction Layer unit),nalu包括nalu header和nalu type.
nalu header固定为0x00000001(帧开始,常见)或0x000001(帧中)。

nalu header:

字段长度(bite)
forbidden_zero_bit1b
nal_unit_type6b
nuh_reserved_zero_6bits6b
nuh_temporal_id_plus13b

H265 帧类型判断:
在文件中查找00 00 00 01NALU头,发现在有6种开头分别为:

00 00 00 01 40 01  的nuh_unit_type的值为 32, 语义为视频参数集        VPS
00 00 00 01 42 01  的nuh_unit_type的值为 33, 语义为序列参数集         SPS
00 00 00 01 44 01  的nuh_unit_type的值为 34, 语义为图像参数集         PPS
00 00 00 01 4E 01  的nuh_unit_type的值为 39, 语义为补充增强信息       SEI
00 00 00 01 26 01  的nuh_unit_type的值为 19, 语义为可能有RADL图像的IDR图像的SS编码数据   IDR
00 00 00 01 02 01  的nuh_unit_type的值为1, 语义为被参考的后置图像,且非TSA、非STSA的SS编码数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2)机器学习基石笔记Lecture2:Learning to Answer Yes/No

目录 0.上节回顾 1. Perceptron Hypothesis Set 2. Perceptron Learning Algorithm(PLA)(重点) 3. Guarantee of PLA(难点) 4. Non-Separable Data 0.上节回顾 第一节课主要讲述了机器学习的定义及机器学习的过程&#xff0…

Google Colab——谷歌免费GPU使用教程

Google Colab简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究。这款工具现在可以免费使用。Google Colab最大的好处是给广大的AI开发者提供了免费的GPU使用!GPU型号是Tesla K80!你可以在上面轻松地跑例如&am…

pyecharts简单使用

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。可以生成很多效果很棒的图表。 pycharts文档 |分割| echarts官网 本文主要介绍pycharts的简单使用 安装 # 安装 1.0.x 以上版本 (需要python3.6及以上) $ …

Ubuntu16.4(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境安装

1. 下载压缩包 文件分享 2. 新建目录并解压 3. 配置环境变量 sudo gedit /etc/bash.bashrc 添加路径并更新路径:(PATH$PATH之间无空格) PATH$PATH://linaro-arm/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/binexport P…

Apollo进阶课程 ④ | 开源模块讲解(下)

目录 1)Apollo平台技术框架 2)Apollo版本迭代 原文链接:​Apollo进阶课程 ④ | 开源模块讲解(下) 上周,阿波君与大家讨论了自动驾驶的核心问题——安全性。本期,我们将为大家具体介绍百度Apo…

SM4 简介

SM4 我国国家密码管理局在20012年公布了无线局域网产品使用的SM4密码算法——商用密码算法。它是分组算法当中的一种,算法特点是设计简沽,结构有特点,安全高效。数据分组长度为128比特,密钥长度为128 比特。加密算法与密钥扩展算法…

九大内置对象

指在JSP的<%%> 和<% %>中可以直接使用的对象&#xff1a;没有特别说明可以开关的默认是开启的 一servlet理论上可以处理多种形式的请求响应形式http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和ServletResponse的之类 二 Http…

3)机器学习基石笔记 Lecture3:Types of Learning

目录 1&#xff09;Learning with Different Output Space Y 2&#xff09;Learning with Different Data Label 3&#xff09;Learning with Different Protocol 4&#xff09;Learning with Different Input Space X 在上一节课中&#xff0c;我们学到了第一个机器学习…

【BZOJ - 3436】小K的农场(差分约束)

题干&#xff1a; 背景 小K是个特么喜欢玩MC的孩纸。。。 描述 小K在MC里面建立很多很多的农场&#xff0c;总共n个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得 一些含糊的信息&#xff08;共m个&#xff09;&#xff0c;以下列…

分组密码简介和五大分组模式

分组密码 分组密码&#xff08;blockcipher&#xff09;是每次只能处理特定长度的一块数据的一类密码算法&#xff0c;这里的一块"就称为分组&#xff08;block&#xff09;。此外&#xff0c;一个分组的比特数就称为分组长度&#xff08;blocklength&#xff09;。例如&…

Java Web(五) JSP详解(四大作用域九大内置对象等)

前面讲解了Servlet&#xff0c;了解了Servlet的继承结构&#xff0c;生命周期等&#xff0c;并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解&#xff0c;但是我们会发现在Servlet中编写一些HTML代码&#xff0c;是很不方便的一件事情&#xff0c;每次都…

Apollo进阶课程 ⑤ | Apollo硬件开发平台介绍

目录 1&#xff09;Uber事故原因分析 2&#xff09;自动驾驶的第一天条-----安全 3&#xff09;自动驾驶汽车的硬件系统 4&#xff09;自动驾驶汽车感知类传感器介绍 5&#xff09;自动驾驶汽车的传感器 6&#xff09;自动驾驶的计算单元 7&#xff09;自动驾驶的线控系…

使用tcpdump,adb进行手机抓包

准备 手机 root PC安装ADB 下载压缩包&#xff0c;解压即可 链接&#xff1a;https://pan.baidu.com/s/1Hv-IqpQutBVTHuriakQUTg 提取码&#xff1a;q57q 配置环境变量 在系统环境Path中添加 adb.exe 的地址 验证安装 adb version 出现版本&#xff0c;即为成功 开启adb服…

依赖注入和控制反转的理解,写的太好了。

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念&#xff0c;对于初学Spring的人来说&#xff0c;总觉得IoC 、DI这两个概念是模糊不清的&#xff0c;是很难理解的&#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…

Apollo进阶课程 ⑥ | 高精地图与自动驾驶的关系

目录 1&#xff09;高精地图与自动驾驶 2&#xff09;什么是高精地图 3&#xff09;高精地图与导航地图 4&#xff09;高精地图---无人驾驶的核心基础模块 5&#xff09;高精地图与定位模块的关系 6&#xff09;高精地图与感知模块的关系 7&#xff09;高精地图与规划、…

【POJ - 1275】Cashier Employment(差分约束,建图)

题干&#xff1a; A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its need. The supermarket manager has hired you to help him, solve his problem. The problem is that the supermarket needs different number of c…

InfluxDB 简介、安装和简单使用

简介 InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成&#xff0c;着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据&#xff0c;IoT行业的实时数据等场景。可以理解为按时间记录一些数据&#xff08;常用的监控数据、埋点统计数据…

4)机器学习基石笔记 Lecture4:Feasibility of Learning

目录 1&#xff09;Learning is Impossible 2&#xff09;Probability to the Rescue 3&#xff09;Connection to Learning 4&#xff09;Connection to Real Learning 上节课我们主要介绍了机器学习问题的类型&#xff0c;主要是二元分类和回归问题。本节课&#xff0c;我…

Java注解全面解析

1.基本语法 注解定义看起来很像接口的定义。事实上&#xff0c;与其他任何接口一样&#xff0c;注解也将会编译成class文件。 Target(ElementType.Method)Retention(RetentionPolicy.RUNTIME)public interface Test {} 除了符号以外&#xff0c;Test的定义很像一个空的接口。…

ubuntu18.04下安装grafana6和简单使用

ubuntu18.04下安装grafana6 环境 ubuntu18.04 下载 sudo apt-get install -y adduser libfontconfig1 # 使用wget 下载会很慢 # 推荐百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1y2I4LwuslB5kHAZwV8RNxw 提取码&#xff1a;o19t # 或者csdn&#xff1a;[gr…