音视频学习(二十五):ts
TS(MPEG-TS,MPEG Transport Stream) 是一种广泛应用于流媒体传输和存储的容器格式。它最早由 MPEG(Moving Picture Experts Group)组织制定,用于视频和音频的压缩编码。在 HLS(HTTP Live Streaming) 等流媒体协议中,常用 TS 格式来封装视频片段(通常为 .ts 文件),用于网络传输和客户端播放。
概述
TS(Transport Stream)是一种为广播和流媒体应用设计的容器格式,具有高容错性和灵活性,能够承载视频、音频、字幕等多种数据流。它常用于卫星电视、广播电视、视频流传输等场景。
- 文件扩展名:
.ts。 - 基本组成:TS 文件将视频和音频编码流(如 H.264、AAC)分割成固定大小的小数据包(通常为 188 字节)。每个数据包包含一个或多个编码流的包头和数据负载。
TS文件结构
一个标准的 MPEG-TS 文件(.ts)主要由 TS 数据包(Transport Stream Packet)组成,每个数据包的大小固定为 188 字节。每个数据包都包含一个 包头 和一个 负载(payload)。
TS 数据包(Transport Stream Packet)结构
每个 TS 数据包的结构如下:
| 字段 | 长度 | 描述 |
|---|---|---|
| 同步字节 | 1字节 | 固定值 0x47,用于标识数据包的开始。 |
| 错误标志 | 1字节 | 指示是否发生了错误。 |
| PID(Packet ID) | 13位 | 表示该数据包的流标识符,决定了该数据包属于哪个流。 |
| 优先级标志 | 2位 | 用于优先级控制,通常设置为 00。 |
| 有效负载指示符 | 1位 | 表示该包是否包含有效的数据。 |
| 继续传输标志 | 1位 | 如果设置为1,表示后续包仍是同一数据流的一部分。 |
| 包计数 | 1字节 | 每个数据包的序列号。 |
| 负载 | 184字节 | 实际存储的视频或音频数据。 |
-
同步字节(Sync Byte):每个 TS 数据包的首字节固定为
0x47,这用于包的同步,确保数据包的正确起始。如果接收到一个包的同步字节不是0x47,则表示包可能已损坏。 -
错误标志(Error Indicator):指示数据包是否损坏。如果包标志为
1,则表示该数据包存在错误,需要丢弃。 -
PID(Packet Identifier):该字段是 13 位长,用于标识该数据包所属于的流类型。每个流都有一个唯一的 PID。例如,视频流、音频流、字幕流等都使用不同的 PID 标识。PID 也有特殊含义:
- 0x1FFF:表示一个无效的 PID,通常用于空数据包。
- 0x0000:用于 PAT(Program Association Table)。
- 0x0001:用于 PMT(Program Map Table)。
-
负载单元开始指示符(Payload Unit Start Indicator):当数据包包含一个新的数据单元时,该指示符为
1。通常,这意味着数据包的负载部分是一个完整的数据单元的开始(如一个视频帧的开始,或者音频数据的开始)。 -
自适应字段控制(Adaptation Field Control):指示数据包是否包含 自适应字段。如果该值为
01,则表示没有自适应字段;如果为10或11,则表示包含自适应字段。自适应字段包含如时间戳、插入控制字节等信息,用于补充流媒体内容。 -
负载(Payload):负载部分承载了实际的数据内容。根据数据包的 PID,负载部分可能包含视频数据、音频数据、字幕数据,或者一些控制数据。例如,视频数据通常是 H.264 编码后的数据,音频数据则可能是 AAC 编码的数据。
包头
-
TS 数据包的包头包含了同步字节和其他控制信息,包头的结构如下:
字段 长度 描述 同步字节 (Sync Byte) 1字节 固定值 0x47,标识数据包开始。错误标志 (Error Indicator) 1位 如果包发生错误,标识设置为 1。PID(Packet Identifier) 13位 用于标识流类型,指向具体的音视频流。 优先级标志 (Priority Flag) 1位 设置为 1表示优先级较高。有效负载标志 (Payload Unit Start Indicator) 1位 如果为 1,表示该数据包是负载的开始。自适应字段控制 (Adaptation Field Control) 2位 标识数据包是否有自适应字段。 包计数(Continuity Counter) 1字节 包的连续性计数。
负载
负载部分的内容根据数据包的类型而不同,可能是视频数据、音频数据或其他类型的控制信息。
- 视频数据:如果该数据包是视频流的一部分,负载将包含如 H.264 编码的视频帧数据。
- 音频数据:如果该数据包是音频流的一部分,负载将包含如 AAC 编码的音频帧数据。
- 字幕数据:如果该数据包是字幕流的一部分,负载将包含字幕数据。
TS 文件中的适应性字段(Adaptation Field)
适应性字段是可选的字段,通常用于补充流信息,如时间戳、插入字节等。适应性字段可以包含:
- 时间戳:用于同步音频和视频流。
- 插入字节:用于数据包的对齐。
- 自适应字段的长度:指示该字段的长度。
适应性字段的出现与否由 自适应字段控制(Adaptation Field Control) 字段决定。如果数据包需要包含这些信息,它将占据包头后的 1 到 184 字节之间的位置。
工作原理
在 HLS 流媒体协议中,TS 文件用于将视频流和音频流分成若干小片段,每个片段大多为 10 秒钟左右。每个 .ts 文件通常由多个 TS 数据包组成,并通过网络传输给客户端进行播放。
编码流的分割
在 HLS 中,视频(如 H.264)和音频(如 AAC)编码后被分割成一个个 TS 数据包。每个 TS 包包含该视频片段的一部分或整个音频流的部分内容。因为 TS 数据包是固定大小的,因此视频流和音频流会被切割成多个包进行传输。
数据传输
每个 TS 文件会包含一个 .m3u8 播放列表文件,客户端根据该播放列表按顺序请求 TS 文件中的数据段。每个 TS 文件通过 HTTP 或其他协议传输给客户端,客户端逐个解析并播放这些数据段。
错误恢复与容错
由于 TS 格式具有良好的容错能力,如果某个 TS 数据包出现损坏,播放器可以通过丢弃该数据包来继续播放后续内容。TS 格式的容错能力主要体现在:
- 每个 TS 数据包的大小固定,可以较容易地实现错误检测和修复。
- 各个流(视频、音频等)通常是独立的,因此如果一个流的数据包损坏,其他流通常不会受到影响。
TS文件的封装与编码
视频与音频封装
在 TS 文件中,视频流和音频流的数据是独立的,它们通过不同的 PID(Packet Identifier)标识。每个 TS 数据包可以包含以下类型的流:
- 视频流:如 H.264 编码的视频流,通常具有特定的 PID。
- 音频流:如 AAC 编码的音频流,具有另一个独立的 PID。
- 字幕流:例如,嵌入的字幕也可以作为一个独立的流进行传输。
HLS 流的 TS 切片
在 HLS 流中,视频源文件会被分割成多个小的 .ts 文件(通常每个文件持续约 10 秒钟)。每个 .ts 文件包含了一个视频段的编码数据,客户端通过 .m3u8 播放列表文件来顺序请求这些 .ts 文件。
TS 文件与 HLS 流的关系
在 HLS 中,每个视频流(如直播视频或点播视频)都被切分成多个小的 TS 文件,每个 TS 文件包含了一个视频片段。播放器使用 .m3u8 播放列表文件中的链接,按顺序加载这些 TS 文件进行播放。
- 每个 TS 文件通常包含一个视频段(如 10 秒钟的 H.264 编码视频片段)和音频段(如 10 秒钟的 AAC 编码音频)。
- 每个
.m3u8播放列表文件会列出这些 TS 文件的路径,播放器根据网络状况逐个请求这些文件。 - HLS 支持多码率流(例如,低码率、中码率和高码率流),每个流使用不同的 TS 文件和
.m3u8播放列表。
TS文件的特点
优点
- 容错性强:由于 TS 包内置的错误检测和修复机制,使得 TS 格式在流媒体传输中具有较强的容错能力,即使网络状况不稳定,也能保证流媒体播放的稳定性。
- 实时性好:TS 格式特别适合实时流媒体的传输,能够在直播等场景中提供较低的延迟。
- 灵活性:TS 文件不仅可以包含视频和音频流,还可以支持字幕、元数据等多种数据流,非常适合多种媒体格式的封装。
缺点
- 文件大小和传输效率:TS 文件通过固定大小的数据包传输,可能会导致一定的网络带宽浪费,尤其是对于低比特率流(例如低清晰度视频)的传输。
- 延迟:由于每个 TS 文件都需要一定的传输时间和播放时间,所以它的延迟通常比其他实时协议(如 RTMP)要高,尤其是在使用 HLS 进行直播时。
TS 文件与其他容器格式的对比
与 MP4 格式:
- MP4 是基于文件的格式,更适合离线存储和播放,不适合流媒体传输。
- TS 格式则是针对流媒体传输而设计,支持边下载边播放,并具有较好的错误恢复能力。
与 FLV 和 RTMP:
- TS 和 FLV 都支持流媒体播放,但 TS 在错误恢复方面表现更好。
- RTMP 通常用于低延迟的直播流,而 TS 更适用于具有容错要求的场景,如通过 HTTP 进行的直播流。
总结
TS 文件(Transport Stream) 是 HLS 流媒体协议中常用的封装格式,它通过将视频、音频和其他数据流切分为固定大小的数据包(188 字节)进行传输,具有高容错性和适应流媒体传输的能力。
相关文章:
音视频学习(二十五):ts
TS(MPEG-TS,MPEG Transport Stream) 是一种广泛应用于流媒体传输和存储的容器格式。它最早由 MPEG(Moving Picture Experts Group)组织制定,用于视频和音频的压缩编码。在 HLS(HTTP Live Stream…...
10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹
本文记录当前最新版虚拟机VMware Workstation Pro(2024.12)如何在win11下共享文件,以实现Windows与Ubuntu互传文件的目的。 1. 创建共享文件夹 1.1 先关闭虚拟机的客户机,打开虚拟机设置 1.2 在虚拟机设置界面找到“选项”->“…...
单元测试mock框架Mockito
为了继续改进 Mockito 并进一步改善单元测试体验,我们希望您升级到 2.1.0!Mockito 遵循语义版本控制,仅在主要版本升级时包含重大更改。在库的生命周期中,重大更改是推出一组全新功能所必需的,这些功能会改变现有行为甚…...
Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
2024多模态大模型综述最新总结
摘要 随着人工智能技术的快速发展,多模态大模型(MLLM)已成为研究的新热点。这些模型以强大的大型语言模型(LLM)为基础,能够处理和理解多种模态信息,如文本、图像、视频和音频。本文综述了MLLM的…...
Redis——缓存穿透
文章目录 1. 问题介绍1.1 定义1.2 举例 2. 解决方案2.1 方案一:空值缓存2.1.1 做法2.1.2 举例2.1.3 示例代码2.1.4 优点2.1.5 缺点 2.2 方案二:布隆过滤器2.2.1 思想2.2.2 做法2.2.3 示例代码2.2.4 优点2.2.5 缺点 2.3 方案三:限流3. 总结 1.…...
1.gitlab 服务器搭建流程
前提条件: 一、服务器硬件水平 搭建gitlab服务器最低配置要求2核4G,低于这个配置的服务器运行效果很差。 gitlab官网:https://about.gitlab.com/ 下载地址:gitlab/gitlab-ce - Packages packages.gitlab.com 本机ubuntu 二、安装依赖 su…...
McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件,包括移动订单进度跟踪和向客户发送营销通信(交易和促销)。 统一事件平台(unified eve…...
GTID详解
概念和组成 1,全局事务表示:global transaction identifiers 2, GTID和事务一一对应,并且全局唯一 3,一个GTID在一个服务器上只执行一次 4,mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如…...
图解HTTP-HTTP状态码
状态码 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。 类别原因短语1XXInformational(信息状态码)接收的请求正在处理2XXSuccess(成功状态码)请求正常处理完毕4XXRedirection (重定向状态码)需要…...
sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR
本文来自天工AI --------- 命令用于安装CMake的脚本,其中--skip-license参数表示跳过许可协议的显示,--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量,应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…...
MySQL 在window免安装启动
复制my.ini文件 初始化命令:mysqld --initialize --console 执行启动bat:启动mysql.bat 主要命令是:mysqld --standalone 免密码启动mysql: mysqld --defaults-file"D:\xxx\soft\mysql-8.0.40-winx64\my.ini" …...
[JavaScript] 我该怎么去写一个canvas游戏
首先你得知道canvas的基础语法,此处不过多赘述. 一、如何更新视图 canvas里面有个clearRect方法,可以遮住画布中一个矩形部分. 但是你想这样做就难免会遮住一些本不该遮住的东西,因为它是一个矩形,并且你还要计算它的位置和尺寸…...
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
目录 为什么要结合项目与算法? 1. 蓝桥杯与《苍穹外卖》项目的结合 实例:基于蓝桥杯算法思想的订单配送路径规划 问题描述: 代码实现:使用动态规划解决旅行商问题 代码解析: 为什么这个题目与蓝桥杯相关&#x…...
python报错系列(16)--pyinstaller ????????
系列文章目录 文章目录 系列文章目录前言一、pyinstaller ????????1.报错如下2.安装pyinstaller3.报错如下:4.封装py文件为exe成功5.国内源 总结 前言 一、pyinstaller ??? 1.报错如下 PS D:\Users\gxcaoty\Desktop\性能覆盖率> pyinstaller37.exe…...
Pytorch | 从零构建ResNet对CIFAR10进行分类
Pytorch | 从零构建ResNet对CIFAR10进行分类 CIFAR10数据集ResNet核心思想网络结构创新点优点应用 ResNet结构代码详解结构代码代码详解BasicBlock 类ResNet 类ResNet18、ResNet34、ResNet50、ResNet101、ResNet152函数 训练过程和测试结果代码汇总resnet.pytrain.pytest.py 前…...
Spring Boot 配置Kafka
1 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。 2 Maven依赖 <dependency><groupId>org.springframework.kafka</groupId><…...
基于单片机的火灾报警器 (论文+源码)
1.系统设计 本系统由火灾检测模块、A/D转换模块、信号处理模块、声光报警模块和灭火装置模块组成。火灾检测模块由温度检测和烟雾检测构成,其温度传感器选用DS18B20,烟雾传感器选用MQ-2烟雾传感器。A/D转换模块选用常用的模数转换芯片ADC0832。声光报警…...
分析excel硕士序列数据提示词——包含对特征的筛选,非0值的过滤
文章目录 1 分析出发点2 围绕出发点的文件分析3 功能模块计算重心相关性计算教学倾向百分比多列相关性计算结果封装证伪——过滤0后的交叉相关系数封装和总控——批量处理特征筛选——筛选提问倾向最大和最小的前五代码总的清洗1 分析出发点 写一个python代码,遍历"D:\Ba…...
MongoDB 更新文档
关于MongoDB更新文档的操作,可以通过多种方法实现。以下是一些常用的方法: updateOne() 方法:用于更新匹配过滤器的单个文档。其语法为 db.collection.updateOne(filter, update, options)。其中,filter 用于查找文档的查询条件&a…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
