⭐四、封装篇
H264封装成mp4、flv等格式,那为什么需要封装?
h264也能播放,但是按照帧率进行播放,可能不准
★FLV
**FLV(Flash Video)**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒体和网页视频播放,尤其在 Flash 技术流行时期,是视频流媒体的标准格式之一。FLV 格式结构简单、文件体积小,适合网络传输。
特点:
- FLV 作为容器格式,可以封装视频、音频和元数据。通常情况下,FLV 中的视频流编码为 H.264,音频流编码为 AAC 或 MP3。
- FLV 文件体积较小,数据流封装效率高,适合网络视频播放,能够减少延迟,便于在带宽较低的情况下流畅播放。
- 设计用于流媒体,FLV 文件支持按时间戳分块封装,便于播放时随时从任意位置读取和加载数据,增强了网络流媒体传输的稳定性。
- FLV 可支持渐进式下载(Progressive Download),边下载边播放
播放过程:在流媒体播放过程中,FLV 文件按照上述标签顺序依次传输 。播放器读取并解析文件头,然后根据标签中的时间戳同步音频和视频。脚本标签包含的元数据会在播放前提供相关信息,而每个标签的类型和数据大小字段用于解析和播放音视频内容。
封装格式
文件头(Header) + 前一个标签大小(Previous Tag Size)+ 标签(Tag)
文件头(9B)
用于标识文件格式和版本信息
- Signature :固定的三个字节
FLV
,用于标识这是一个 FLV 文件。 - Version :表示 FLV 的版本,通常为
0x01
。 - Type Flags:指示文件中是否包含音频(Audio)和视频(Video)数据。
- Data Offset:表示 FLV 文件头的长度。
FLV Body = Previous Tag Size + Tag
Previous Tag Size : 4 字节 字段,表示前一个标签的大小。这一字段的作用是便于解析器快速跳到下一个标签的位置。
Tag = Tag Header + Tag Data
- Tag Type:表示标签类型(0x08 表示音频标签,0x09 表示视频标签,0x12 表示脚本/元数据标签)。
- Data Size:表示该标签的数据部分的大小。
- Timestamp:用于同步音视频的时间戳。对于视频文件,这个时间戳决定了标签在播放中的位置。
- Stream ID :流标识,一般设置为
0
,保留供未来使用。 - Tag Data:实际的数据部分,包含音频、视频或元数据。
★TS
一种流媒体传输格式 ,全称为 MPEG-TS(MPEG Transport Stream) ,广泛用于数字视频和音频的传输。设计目的在于有效传输视频和音频数据,同时保证在不同网络环境下的传输稳定性。
特点:
封装结构:TS 是一种容器格式。每个流在 TS 中都作为一个独立的"包"(packet)传输,通常每个包的大小为 188 字节,便于同步和处理。
高容错性 :TS 包含冗余数据和错误校验信息,使其能够在传输中发现和纠正错误,适合在不稳定的网络环境下使用
实时流传输 :TS 具有实时传输 的特点,通过加入时间戳来保证音视频同步(PTS/DTS),能够支持音视频的实时流式播放。
灵活性:可以封装多种格式的音频(如 AAC、MP3)和视频(如 H.264、H.265),适合多路流媒体传输,也支持动态切换多个音视频流。*
分层结构
分层结构是分层结构是基于 ISO/OSI 模型,专为高效、多路传输设计。它分为三层结构,以支持多路音视频和数据流的实时、可靠传输:,专为高效、多路传输设计。它分为三层结构,以支持多路音视频和数据流的实时、可靠传输:
-
ES层
内容:最底层的数据流 ,包含压缩编码后的原始音视频数据,如 H.264 编码的图像数据或 AAC 编码的音频数据。
作用:不包含任何时间戳或识别信息,主要专注于原始的音视频内容编码
一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。
-
PES层
内容 :PES 层在 ES 层的基础上增加了时间戳(PTS/DTS)等信息,确保音视频同步。
作用 :将原始的 ES 数据打包成更小的片段,便于在传输流中处理;PES 包头还包含信息以区分视频、音频或其他数据。
ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头(类似于传输层的做法)
-
TS层
内容 :在 PES 层的基础上加入了数据流的识别信息(PID)和传输相关的控制信息。
作用 :TS 层是传输的最终封装格式,将 PES 包切分成 188 字节的 TS 包,每个包中包含同步字、PID、错误校验等信息,确保在网络传输中能够恢复数据,便于多路流的管理与传输。
ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。
-
TS Header:控制和识别,确保接收端识别数据包类型和顺序。
包含的字节内容:
-
同步字节(Sync Byte) :固定为
0x47
,用于包头识别和数据同步。 -
传输错误指示(TEI):用于标识传输错误。
-
有效负载单元起始指示(Payload Unit Start Indicator, PUSI):指示是否为新的 PES 包的起始。
-
★PID(Packet Identifier):识别和区分不同类型的数据流,如音频、视频或信令数据(PAT/PMT 等)。
-
pid 决定了负载内容的类型 ,主要包括:
PAT表
,PMT表
,视频流,音频流。常用的PID值:-
PAT 0x0000
作用 :PAT 是节目关联表,包含 TS 流中所有节目的 PID 信息。
用途 :
帮助接收端找到每个节目的 PMT(Program Map Table)位置
,理解流中有哪些节目以及各节目对应的 PMT PID。 -
PMT :PMT 是节目映射表 ,
通过 PAT 表找到 PMT PID 后,可以解析某个节目具体的音视频流的 PID
。 -
视频流 PID :音视频的 PID 在 PMT 中定义,通常为一个特定节目中的视频数据流。接收端通过 PMT 获取特定节目的视频 PID。
-
音频流 PID:与视频流类似,PMT 还定义了音频流的 PID,接收端通过 PMT 找到并解码音频流。
-
-
-
控制字段:包括优先级、加扰控制和连续计数器等,用于数据流的管理和加密。
-
-
Adaptation Field:用于同步和补充,确保数据流的时间准确性。
-
Payload:实际的音视频数据或信令信息,是 TS 包中最核心的内容。
-
★MP4
常用的多媒体容器格式,广泛用于存储音频、视频、字幕以及元数据
特点:
容器格式:MP4 本身不是编码格式,而是一个封装格式,可以包含多种编码格式的音视频内容(例如 H.264、AAC)。
高兼容性:MP4 格式在各种设备(如手机、电脑、电视)和平台上都有很高的兼容性,广泛支持。
流媒体支持:MP4 支持流式传输,可以用于网络环境中按需播放音视频。
灵活的内容组合:MP4 容器可以同时包含视频、音频、字幕和元数据,方便实现多语言字幕、章节、封面等丰富内容。
MP4的文件结构
MP4 文件结构基于 box(盒子) 的概念,每个box包含不同的信息,这些box以树形结构的方式组成。每个 Box 都包含一个 Header(头部) 和 Payload(有效载荷)。
box 由 header 和 body 组成,header 指明 box 的 size 和 type。size 是包含 box header 的整个 box 的大小。
-
Header:包括盒子的大小和类型。
- box type,通常是4个ASCII码的字符如"ftyp"、"moov"等
- ftyp(File Type Box):指定 MP4 文件的格式、兼容性和品牌,位于文件开头。它描述了文件的主品牌(Major Brand)、次要版本(Minor Version)、兼容品牌(Compatible Brands)。
- moov(Movie Box):存储文件级的元数据,包含有关整个媒体文件的信息。
- mdat(Media Data Box):存储音视频实际数据的 Box。
- box type,通常是4个ASCII码的字符如"ftyp"、"moov"等
-
Payload:存储媒体数据或控制信息,可以嵌套其他 Box
!
MP4 文件播放流程
播放器在播放 MP4 文件时通常会按以下流程读取:
- 读取
ftyp
Box:判断文件格式和兼容性。 - 读取
moov
Box:获取文件的元数据和轨道信息。 - 读取
mdat
Box :加载实际的音视频数据,并根据moov
中的索引信息解码播放。 - 分段播放(moof/mfra) :对于流媒体或按需播放的 MP4 文件,播放器可以利用
moof
和mfra
快速访问并流式播放片段。