音视频学习(二十五):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…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...