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,一经查实,立即删除!

相关文章

ROS入门之——浅谈launch

0.何为launch? launch,中文含义是启动,launch文件顾名思义就是启动文件,要说这launch文件啊,那还得从roslaunch说起。 相传,在程序猿们还没有使用roslaunch之前,需要手动rosrun逐个启动node&am…

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…

【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)

题干: 求每个*能够到达的格子数量,只有.可以走(四个方向扩展),结果mod 10,替换 * 后输出。 Input The first line contains two integers n, m (1 ≤ n, m ≤ 1000) — the number of rows and co…

scapy和dpkt使用

scapy官方文档 Scapy 下载 # (临时换pip源) pip install scapy (-i https://pypi.tuna.tsinghua.edu.cn/simple/)导入 from scapy.all import *读取pcap文件,进行相关操作 # 读取文件 # 整个文件:packets:scapy.plist.PacketList对象 &…

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

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

javaBean和Servlet的区别

可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类。特殊在可以通过<jsp:useBean />调用JavaBean。而其他类,可以和一般java中一样使用。 Bean的参数中还可以指定范围, <jsp:useBean scope"application" />该Bean在服务器的JVM中将只有一个…

pyecharts简单使用

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

【POJ - 2373】Dividing the Path(单调队列优化dp)

题干&#xff1a; Farmer Johns cows have discovered that the clover growing along the ridge of the hill in his field is particularly good. To keep the clover watered, Farmer John is installing water sprinklers along the ridge of the hill. To make installa…

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

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

JAVA高级工程师课程笔记整理——(八)tomcat与九大内置对象

&#xff08;八&#xff09;tomcat与九大内置对象 tomcat B/S 浏览器/服务器 请求&#xff1a;request 响应: response C/S&#xff1a; 客户端/服务器 URL: 网址 URI: 范围包括url http https: 更安…

tshark 小技巧

将pcap转换成json文件&#xff0c;全部特征名都会在json中 tshark -T json -r D:\test.pcap > test.json合并数据包 mergecap -w all.pcap 1.pcap 2.pcap ...all.pcap: 合并之后的数据包 1.pcap ... 要合并的数据包&#xff0c;可以合并n个

【CodeForces - 1201C】Maximum Median(思维,水题)

题干&#xff1a; You are given an array aa of nn integers, where nn is odd. You can make the following operation with it: Choose one of the elements of the array (for example aiai) and increase it by 11(that is, replace it with ai1ai1). You want to make …

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

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

SM4 简介

SM4 我国国家密码管理局在20012年公布了无线局域网产品使用的SM4密码算法——商用密码算法。它是分组算法当中的一种&#xff0c;算法特点是设计简沽&#xff0c;结构有特点&#xff0c;安全高效。数据分组长度为128比特&#xff0c;密钥长度为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;自动驾驶的线控系…