视频基础知识 2

简介: 视频基础知识

二、音视频封装原理

1、封装和解封装

对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装。

  • 封装:就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。
  • 解封装:就是封装的逆过程,拆解协议包,处理包头中的信息

2、封装格式

封装格式也称多媒体容器,它只是为多媒体编码提供了一个“外壳”。

封装格式业界也有人称音视频容器,比如我们经常看到的视频后缀名:mp4、rmvb、 avi、mkv、mov 等就是音视频的容器,它们将音频和视频甚至是字幕一起打包进去,封装成一个文件。


封装格式:AVI、VOB、WMV、RM、RMVB、MOV、MKV、FLV、MP4、MP3、WebM、DAT、3gpp、asf、mpeg、ogg

视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。


MPG:MPEG 编码采用的容器,具有流的特性。里面又分为 PS,TS 等,PS 主要用于 DVD存储,TS 主要用于 HDTV。

VOB:DVD 采用的容器格式,支持多视频多音轨多字幕章节等。

MP4:MPEG-4 编码采用的容器,基于 QuickTime MOV 开发,具有许多先进特性。

AVI:音视频交互存储,最常见的音频视频容器。支持的视频音频编码也是最多的。

ASF:Windows Media 采用的容器,能够用于流传送,还能包容脚本等。

3GP:3GPP 视频采用的格式,主要用于流媒体传送。

RM:RealMedia 采用的容器,用于流传送。

MOV:QuickTime 的容器,恐怕也是现今最强大的容器,甚至支持虚拟现实技术,Java等,它的变种 MP4,3GP 都没有这么厉害。

MKV:MKV 它能把 Windows Media Video,RealVideo,MPEG-4 等视频音频融为一个文件,而且支持多音轨,支持章节字幕等。

OGG:Ogg 项目采用的容器,具有流的特性,支持多音轨,章节,字幕等。

OGM:Ogg 容器的变种,能够支持基于 DirectShow 的视频音频编码,支持章节等特性。

WAV:一种音频容器,大家常说的 WAV 就是没有压缩的 PCM 编码,其实 WAV 里面还可以包括 MP3 等其他 ACM 压缩编码。

①、MP4

MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在 “ISO/IEC 14496-14” 标准文件中定义的,属于 MPEG-4 的一部分。

MP4 是一种较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,不过我们常见的大部分的 MP4 文件存放的 AVC(H.264)或 MPEG-4(Part 2)编码的视频和 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 文件结构):


f675ec738b5846d4b7ebd533bcf13df9.png

根节点之下,主要包含以下三个 box 节点:

  • ftyp:File Type Box,文件类型
  • 一个 MP4 文件有且仅有一个 “ftyp” 类型的 box,作为 MP4 格式的标识并包含一些关于文件的一些信息;
  • moov:Movie Box,文件媒体的 metadata 信息
  • ftyp box 之后会有一个 “moov” 类型的 box(Movie Box) ,它是一种 container box,子 box 中包含了媒体的 metadata 信息;

mdat:Media Data Box,具体的媒体数据

  • MP4 文件的媒体数据包含在 “mdat” 类型的 box(Midia Data Box)中,该类型的 box 也是
  • container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由 metadata 进行描述;

②、AVI

容器 AVI(Audio Video Interleaved)即音视频交错格式是一门成熟的老技术,尽管国际学术界公认 AVI 已经属于被淘汰的技术, 但是简单易懂的开发 API 还在被广泛使用。


AVI 符合 RIFF(Resource Interchange File Format)文件规范,使用四字符码 FOURCC(four-character code)来表征数据类型。AVI 的文件结构分为头部、主体和索引三部分。主体中图像数据和声音数据是交互存放的,从尾部的索引可以索引跳到自己想放的位置。

<1>、基本数据单元

AVI 中有两种最基本的数据单元,一个是 chunk,一个是 list。这两种结构如下:

Chunks:Chunks 数据块由一个四字符码、4 字节 data size(指下面的数据大小)以及数据组成。

List:由四部分组成,四个字节四字符码(“list”) 、4 字节数据大小(指后面列的两部分数据大小) 、四字节 list 类型以及数据组成,与 Chunk 数据块不同的是, List 数据内容可以包含字块(Chunk 或 List)。

<2>、AVI 文件结构

AVI 文件采用 RIFF 文件结构方式,使用四字符码 FOURCC(four-character code) 来表征数据类型,比如 ‘RIFF’、‘AVI’、‘LIST’ 等,通常我们称四字符码为数据块 ID。因此首先我们需要了解一个标准 RIFF 文件结构。


RIFF 文件的基本单元叫做数据块(Chunk),如上面基本数据单元的介绍,由数据块四字符码(数据块 ID)+ 数据长度 + 数据组成。


整个 RIFF 文件可以看成一个数据块,其数据块 ID 为 “RIFF”, 称为 RIFF 块。一个RIFF 文件中只允许存在一个 RIFF 块。


RIFF 块中包含一系列其他子块,其中 ID 为 “LIST” 称为 LIST 块,LIST 块中可以再包含一系列其他子块,但除了 LIST 块外的其他所有的子块都不能再包含子块。


有了 RIFF 文件结构的了解,下面这张 AVI 文件结构图就比较好理解了。需要说明的是,一个 AVI 通常都包含以下几个字块:


ID 为 “hdrl” 的 list 块,包含了音视频信息,描述媒体流信息

ID 为 “info” 的 list 块,包含编码该 AVI 的程序信息

ID 为 “junk” 的 chunk 数据块,无用数据,用于填充

ID 为 “movi” 的 list 块,包含了交错排列的音视频数据

ID 为 “idxl” 的 chunk 块,包含音视频排列的索引数据(可选块)

AVI 文件结构图如下:


35740b834f2346beba82a2de1c0f0344.png

③、FLV

<1>、简介

FLV( Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了 FLV 格式。另外由于当前浏览器与 Flash Player 紧密的结合,使得网页播放 FLV 视频轻而易举,也是 FLV 流行的原因之一。


FLV 是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV 包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的 Tag 及 Tag Size 对组成。


c6e255921d464534bf37ebe990981c8d.png

<2>、FLV 格式解析

先来一张图, 这是《东风破》 ——周杰伦(下载) 的一个 MV 视频。我使用的是 Binary Viewer 的二进制查看工具。

7e278511d2d34ab8916cbf285701441f.png


header:头部分由 Signature(3 Byte) + Version(1 Byte) + Flags(1 Bypte) + DataOffset(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 为 scripts

tag 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 包复合合成。

TS 流( Transport Stream):传输流,TS 流由固定长度( 188 字节)的 TS 包组成,TS 包是对 PES 包的另一种封装方式, 同样由具有同一时间基准的一个或多个 PES 包复合合成。PS 包是不固定长度,而 TS 包为固定长度。

为便于传输,实现时分复用,基本流 ES 必须打包,就是将顺序连续、连续传输的数据流按一定的时间长度进行分割,分割的小段叫做包,因此打包也被称为分组。


MPEG-2 标准中,有两种不同的码流可以输出到信号,一种是节目码流(PS Program Stream),一种是传输流(TS Transport Stream) 。


由于 TS 码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2 码流基本上都采用 TS。


TS 流形成过程

9e456eed06fc4b4b96edd034c6533e86.png

以电视数字信号为例:


原始音视频数据经过压缩编码得到基本流 ES 流

生成的 ES 基本流比较大,并且只是 I、P、B 这些视频帧或音频取样信息。

对 ES 基本流 进行打包生成 PES 流

通过 PES 打包器,首先对 ES 基本流进行分组打包,在每一个包前加上包头就构成了PES 流的基本单位 —— PES 包,对视频 PES 来说,一般是一帧一个包,音频 PES 一般一个包不超过 64KB。

PES 包头信息中加入了 PTS、DTS 信息,用与音视频的同步。

同一时间基准的 PES 包经过 TS 复用器生成 TS 传输包

PES 包的长度通常都是远大于 TS 包的长度,一个 PES 包必须由整数个 TS 包来传送,没装满的 TS 包由填充字节填充。PES 包进行 TS 复用时,往往一个 PES 包会分存到多个 TS 包中

将 PES 包内容分配到一系列固定长度的传输包(TS Packet)中。TS 流中 TS 传输包头加入了 PCR(节目参考时钟)与 PSI(节目专用信息) ,其中 PCR 用于解码器的系统时钟恢复。

950137fa27094762a8cfa8300f62a048.png

PCR 时钟作用:我们知道,编码器中有一个系统时钟,用于产生指示音视频正确显示和解码的时间标签(DTS、PTS) 。解码器在解码时首先利用 PCR 时钟重建与编码器同步的系统时钟,再利用 PES 流中的 DTS、PTS 进行音视频的同步。


⑤、M3U8

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS)协议格式的基础,这种协议格式可以在 iPhone和 Macbook 等设备播放。


可以看到,m3u8 文件其实是 HTTP Live Streaming(缩写为 HLS)协议的部分内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。


HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。


简而言之,HLS 是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于m3u8 文件(即 playlist) 内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。


m3u8 文件实质是一个播放列表( playlist),其可能是一个媒体播放列表(MediaPlaylist),或者是一个主列表(Master Playlist) 。但无论是哪种播放列表, 其内部文字使用的都是 utf-8 编码

05614849ff274cc8b2bfd764d44ee141.png

当 m3u8 文件作为媒体播放列表(Meida Playlist) 时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。其格式如下所示:


对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要定时重新请求该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。


当 m3u8 作为主播放列表(Master Playlist) 时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Stream) 。

f4f68a51e1fd4b83a2a2ccea30674752.png

该备用流资源指定了多种不同码率,不同格式的媒体播放列表,并且,该备用流资源也可同时提供不同版本的资源内容, 比如不同语言的音频文件, 不同角度拍摄的视屏文件等等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。


目录
相关文章
|
6月前
|
缓存 安全 SoC
GICV2&GICV3的基础知识
GICV2&GICV3的基础知识
192 0
|
存储 编解码 监控
视频基础知识 3
视频基础知识
150 0
|
3月前
|
存储 监控 安全
安全基础知识
【8月更文挑战第9天】
41 1
|
6月前
|
机器学习/深度学习 人工智能 大数据
一些基础知识
了解人工智能基础,探索AI系统如何结合算法、机器学习和数据分析模拟人类智能。从 Siri 和 Alexa 的语音助手到 Netflix 的个性化推荐,AI已深入日常生活中。查阅《人工智能入门手册(AI101)》深入学习,同时参考《抖音百科》和《大数据》拓宽知识领域。
|
存储 编解码 算法
视频基础知识 1
视频基础知识
206 0
|
存储 Web App开发 SQL
基础知识
基础知识
107 0
|
编译器 C++
C++模板基础知识
本文将讲述C++模板初阶的相关知识。
145 1
前后台交互基础知识
在别人造的轮子上飞奔的时候,轮子背后的前后台交互如何进行一脸懵$.
72 0
|
安全 编译器 程序员
【C++】C++基础知识
其中 { } 内容即为命名空间的成员,注意最后右花括号后不用加分号结尾。