音视频学习(二十五):ts

news2024/12/24 1:34:02

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,则表示没有自适应字段;如果为 1011,则表示包含自适应字段。自适应字段包含如时间戳、插入控制字节等信息,用于补充流媒体内容。

  • 负载(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 字节)进行传输,具有高容错性和适应流媒体传输的能力。

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

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

相关文章

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

02-1:python入门基础Python变量与数据类型

一、Python 变量的定义 (一)定义方式 在 Python 中,变量的定义是通过赋值来实现的,其语法格式非常简洁直观,基本形式为 “变量名 值”。等号左边是你自定义的变量名,右边则是要赋给该变量的值。Python 是…

在Vue3中实现文件上传功能,结合后端API

随着现代Web应用程序的不断发展,文件上传成为了用户交互中不可或缺的一部分。在本篇博客中,我们将深入讨论如何在Vue3中实现一个文件上传功能,并与后端API进行交互。我们将使用Vue3的Composition API(setup语法糖)来构…

详细ECharts图例3添加鼠标单击事件的柱状图

<!DOCTYPE html><html><head><meta charset"UTF-8"><script src"js/echarts.js"></script> <!-- 确保路径正确 --><title>添加鼠标单击事件的柱状图</title></head><body><div id&q…

Redis Hash Tag 知识详解

一、Redis Hash Tag概述 Redis Hash Tag是Redis集群环境里用于控制数据分片的关键机制。在Redis集群中&#xff0c;数据依据键的哈希值来确定分片存储位置。Hash Tag能让用户指定键的特定部分作为哈希计算核心部分&#xff0c;进而使相关键存储于同一节点&#xff0c;这对处理…

Java 初学者的第一个 SpringBoot3.4.0 登录系统二

Java 初学者的第一个 SpringBoot3.4.0 登录系统二 SpringBoot 3.4.0 是 SpringBoot 的最新版本&#xff0c;是乐衷与新技术的 Java 初学者和程序员的选择。和 SpringBoot3.4.0 搭配的各种软件组件也是新的潮流。Java 通用代码生成器光&#xff0c;2.4.0 电音之王尝鲜版十支持新…

SSH客户端

SSH客户端 在VMware界面中操作虚拟机非常不友好&#xff0c;所以一般推荐使用专门的SSH客户端。市面上常见的有&#xff1a; Xshell&#xff1a;个人免费&#xff0c;商业收费&#xff0c;之前爆出过有隐藏后门。不推荐Finshell&#xff1a;基础功能免费&#xff0c;高级功能…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

java中的方法的重载和重写、构造器

目录 方法的重载和重写、构造器1.java的修饰符&#xff1a;2.普通方法3.构造器&#xff08;也叫构造方法/构造函数&#xff09;4.方法的重载5.补充6.方法的重写7.类的执行顺序8.再看方法的重写 方法的重载和重写、构造器 1.java的修饰符&#xff1a; public修饰的代码&#xf…

Halcon例程代码解读:安全环检测(附源码|图像下载链接)

安全环检测核心思路与代码详解 项目目标 本项目的目标是检测图像中的安全环位置和方向。通过形状匹配技术&#xff0c;从一张模型图像中提取安全环的特征&#xff0c;并在后续图像中识别多个实例&#xff0c;完成检测和方向标定。 实现思路 安全环检测分为以下核心步骤&…

前端知识补充—HTML

1. HTML 1.1 什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔ 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它的学者所加的评注、补充或脚注等等 标记语⾔: 由标签构成的语⾔…

springboot根据租户id动态指定数据源

代码地址 码云地址springboot根据租户id动态指定数据源: springboot根据租户id指定动态数据源,结合mybatismysql多数源下的事务管理 创建3个数据库和对应的表 sql脚本在下图位置 代码的执行顺序 先设置主数据库的数据源配置目标数据源和默认数据源有了主库的数据源&#xff…

powershell美化

powershell美化 写在前面 除了安装命令&#xff0c;其他都是测试命令&#xff0c;后续再写进配置文件 安装主题控件 安装主题oh-my-posh&#xff0c;powershell中执行 winget install JanDeDobbeleer.OhMyPosh -s winget oh-my-posh init pwsh | Invoke-Expression # 查看…

Docker监控新纪元:Prometheus引领高效容器监控革命

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 •座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&…

arcgisPro将面要素转成CAD多段线

1、说明&#xff1a;正常使用【导出为CAD】工具&#xff0c;则导出的是CAD三维多线段&#xff0c;无法进行编辑操作、读取面积等。这是因为要素面中包含Z值&#xff0c;导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值&#xff0c;再导出为CAD&#xff0c;则得到…

R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)

1. 上下标 # 注意y轴标签文字 library(ggplot2) ggplot(mtcars, aes(mpg, cyl))geom_point()ylab(label bquote(O[3]~(ug / m^3)))2. 希腊字母&#xff0c;如alpha ggplot(mtcars, aes(mpg, cyl))geom_point()ylab(label bquote(O[3]~(ug / m^3)))ggtitle(expression(alpha))…

WebContainerapi 基础(Web IDE 技术探索 一)

前言 随着web技术的发展&#xff0c;在网页端直接运行node.js、实现微型操作系统已经不再是难事。今天介绍的 WebContainers就是一个基于浏览器的运行时&#xff0c;用于执行 Node.js 应用程序和操作系统命令&#xff0c;它完全运行在您的浏览器页面中&#xff0c;提供了文件系…

解决pytorch安装中的三个错误

查明已安装python版本为3.12.7后&#xff0c;创建虚拟环境。 报错内容&#xff1a;ArgumentError: one of the arguments -n/–name -p/–prefix is required 解决方式&#xff1a; 输入 conda create -n pytorch python3.8即可安装成功。 参考文章&#xff1a;https://blo…

LeetCode:104.二叉树的最大深度

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节…

上传文件(vue3)

使用el-upload 先上传到文件服务器&#xff0c;生成url 然后点击确定按钮&#xff1a; 保存数据 <template><el-dialog top"48px" width"500" title"新增协议" :modelValue"visible" close"handleClose()">…