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