MP4
- MP4(MPEG-4 Part 14) 是一种常见的多媒体容器格式,它是在 “ISO/IEC 14496-14” 标准文件中定义的,属于 MPEG-4 的一部分。
- MP4 是一种较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,不过我们常见的大部分的 MP4 文件存放的 AVC(H.264) 或 MPEG-4(Part2) 编码的视频和AAC编码的音频。MP4 格式的官方文件后缀名是“.mp4”,还有其他的以 mp4 为基础进行的扩展或者是阉割版的格式,如 M4V、3GP、F4V 等
- box结构树
-MP4 文件中所有数据都装在 box 中,也就是说 MP4 由若干个 box 组成,每个 box有类型和长度,包含不同的信息,可以将 box 理解为一个数据对象块。box 中可以嵌套另一个 box,这种 box 称为 container box。
-MP4 文件 box 以树形结构的方式组织,一个简单的 MP4 文件由以下 box 结构数组成(mp4info工具查看 MP4 文件结构):
- 根节点之下,主要包含以下三个box节点:
-ftyp:Fie Type Box,文件类型
-moov:Movie Box,文件媒体的metadata信息
-mdat:Media Data Box,具体的媒体数据 - ftyp: 一个MP4文件有且仅有一个“ftyp”类型的box,作为MP4格式的表示并包含一些关于文件的一些信息。
- moov:ftyp box 之后会有一个moov类型的box,它是一种container box,子box中包含了媒体的metadata信息;
- mdat: MP4文件的媒体数据包含在“mdat”类型的box中,该类型的box也是contaner box,可以由多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。
当涉及MP4封装格式时,可以将ftyp、moov和mdat简单地理解如下:
-
ftyp(File Type Box):它是MP4文件的开头部分,告诉解码器该文件的类型和兼容性。类似于一个身份证,标识这个文件是什么类型的。
-
moov(Movie Box):它包含了视频文件的基本信息,像是时长、帧率、画面大小等。它还保存着各个音频和视频轨道的具体信息,比如编码格式、采样率等。
-
mdat(Media Data Box):它是MP4文件中存储实际音频和视频数据的部分。这些数据是经过特殊编码的,真正的音频和视频内容都在mdat box里面。
-
总结起来,ftyp告诉播放器文件的类型和兼容性,moov提供了关于视频文件的基本信息,而mdat则存储了实际的音频和视频数据。这三者共同协作,使得播放器能够正确解析和播放MP4文件。
AVI
-
容器 AVI(Audio Video Interleaved) 即音视频交错格式是一门成熟的老技术,尽管国际学术界公认 AVI 已经属于被淘汰的技术,但是简单易懂的开发 API,还在被广泛使用。
-
AVI 符合 RIFF (Resource lnterchange File Format) 文件规范,使用四字符码 FOURCC (four-character code) 来表征数据类型。AVI 的文件结构分为头部、主体和主体中图像数据和声音数据是交互存放的,从尾部的索引可以索引跳到自己索引三部分。想放的位置。
-
AVI 本身只是提供了这么一个框架,内部的图像数据和声音数据格式可以是任意的编码形式。因为索引放在了文件尾部,所以在播网络流媒体时已属力不从心。一个很简单的例子,从网络上下载 AVI 文件,如果没有下载完成,是很难正常播放出来。
1、 基本数据单元
AVI 中有两种最基本的数据单元,一个是 chunk,一个是 list。这两种结构如下:
如上可知,Chunks 数据块由一个四字符码、4 字节 data size(指下面的数据大小)以及数据组成。
List 由四部分组成,四个字节四字符码 (“list”)、4 字节数据大小(指后面列的两部分数据大小)、四字节 list 类型以及数据组成,与 Chunk 数据块不同的是,List 数据内容可以包含字块 (Chunk 或 List)。
FLV
1) 简介
FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了 FLV格式。另外由于当前浏览器与 Flash Plaver 紧密的结合,使得网页播放 FLV视频轻而易举,也是 FLV流行的原因之一。
FLV是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV 包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的 Tag 及 Tag Size对组成。
header
头部分由一下几部分组成
Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+Dataffset(4 Byte)
signature占3个字节固定 FLV三个字符作为标示。一般发现前三个字符为 FLV 时就认为他是 flv文件
- Version 占1个字节
标示 FLV 的版本号。这里我们看到是 1 - Flags 占1个字节
内容标示。第0位和第2 位,分别表示 video 与 audio 存在的情况.(1 表示存在,0 表示不存在)。截图看到是 0x05,也就是 00000101,代表既有视频,也有音频。 - DataOffset 4个字节
表示 FLV 的 header 长度。这里可以看到固定是 9.
body
FLV的 body 部分是由一系列的 back-pointers + tag 构成
- back-pointers 固定 4 个字节,表示前一个 tag 的 size。
- tag 分三种类型,video、audio、scripts。
tag组成
tag type+tag data size+Timestamp+TimestampExtended+stream id+ tag data
- type_1个字节。8为Audio,9为 Video,18为 scriptstag
- data size 3 个字节。表示 tag data的长度。从streamd id 后算起
- Timestreamp 3 个字节。时间戳
- TimestampExtended 1个字节。
- 时间截扩展字段stream id 3个字节。总是0
- tag data 数据部分
TS
TS 全称是 MPEG2-TS,MPEG2-TS 是一种标准容器格式,传输与存储音视频、节目与系统信息协议数据,广泛应用于数字广播系统,我们日常数字机顶盒接收到的就是 TS (Transport Stream,传输流)流。
- TS 传输流
首先需要先分辨 TS 传输流中几个基本概念
-ES (Elementary Stream ) : 基本流,直接从编码器出来的数据流,可以是编码过的音频、视频或其他连续码流
-PES (Packetized Elementary Streams) : PES 流是 ES 流经过 PES 打包器处理后形成的数据流,在这个过程中完成了将 ES 流分组、加入包头信息(PTS、DTS 等)操作。PES 流的基本单位是 PES 包,PES 包由包头和 payload组成
-PS 流(Program Stream):节目流,PS 流由 PS 包组成,而一个 PS 包又由若千个 PES包组成。一个 PS 包由具有同一时间基准的一个或多个 PES包复合合成。
M3U8
-
M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。"M3U”和“M3U8”文件都是苹果公司使用的 HTTP Live Streaming (HLS) 协议格式的基础,这种协议格式可以在 iPhone和 Macbook 等设备播放。
-
可以看到,m3u8 文件其实是 HTTP Live Streaming(缩写为 HLS) 协议的部分内容而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。
-
**HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。**当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8)playlist 文件,用于寻找可用的媒体流。
-
HLS 只请求基本的 HTTP 报文,与实时传输协议 (RTP) 不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来 传输媒体流。
-
HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8)playlist 文件,用于寻找可用的媒体流。
-
HLS 只请求基本的 HTTP 报文,与实时传输协议 (RTP) 不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。
-
简而言之,HLS 是新一代流 媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 plavlist) 内,其中附带一些额外描述(比如该资源的多带宽信息···) 用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。
-
因此,客户端获取 HLS 流文件,主要就是对 m3u8 文件进行解析操作
-
那么,下面就简单介绍下 m3u8 文件。