FFmpeg入门详解之19:音视频封装原理简介

什么是数据封装和解封装?

数据封装(baiData Encapsulation),笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。

解封装,就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业务信息数据封装和解封装是一对逆过程。

视频数据的封装

    对于任何一部视频来说,只有图像,没有声音,肯定是不行的。

    所以,视频编码后,加上音频编码,要一起进行封装。

    封装:就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。

    再通俗点,视频轨相当于,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。

    目前主要的视频容器有如下:

    MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。

    封装之后的视频,就可以传输了,你也可以通过视频播放器进行解码观看。

什么是音视频的封装格式

    封装格式也称多媒体容器,它只是为多媒体编码提供了一个“外壳”,也就是将所有的处理好的视频、音频或字幕都包装到一个文件容器内呈现给观众,这个包装的过程就叫封装

封装格式

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

    视频封装格式如 mp4、mkv,用来存储或传输编码数据,可以理解成一个容器。

    日常生活中,看到的视频文件的后缀名如 .mp4、.avi、.rmvb 都是属于视频文件的封装格式。

    所谓封装格式,就是以怎样的方式将视频轨、音频轨、字幕轨等信息组合在一起。说得通俗点,视频轨相当于,而音频轨相当于,封装格式就是一个或者一个,是用来盛放饭菜的容器。

    封装就是按照一定规则把音视频、字幕等数据组织起来,包含编码类型等公共信息,播放器可以按照这些信息来匹配解码器、同步音视频。

    不同的封装格式支持的视音频编码格式是不一样的,比如 MKV 格式支持比较多,RMVB 则主要支持 Real 公司的视音频编码格式。

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

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

    

    常见的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等文件其实只能算是一种封装标准。

    一个完整的视频文件是由音频和视频2部分组成的

    H264、Xvid等就是视频编码格式,MP3、AAC等就是音频编码格式。

名称

推出机构

流媒体

支持的视频编码

支持的音频编码

目前使用领域

AVI

Microsoft Inc.

不支持

几乎所有格式

几乎所有格式

BT下载影视

MP4

MPEG

支持

MPEG-2, MPEG-4, H.264, H.263等

AAC, MPEG-1 Layers I, II, III, AC-3等

互联网视频网站

TS

MPEG

支持

MPEG-1, MPEG-2, MPEG-4, H.264

MPEG-1 Layers I, II, III, AAC,

IPTV,数字电视

FLV

Adobe Inc.

支持

Sorenson, VP6, H.264

MP3, ADPCM, Linear PCM, AAC等

互联网视频网站

MKV

CoreCodec Inc.

支持

几乎所有格式

几乎所有格式

互联网视频网站

RMVB

Real Networks Inc.

支持

RealVideo 8, 9, 10

AAC, Cook Codec, RealAudio Lossless

BT下载影视

  • 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 文件结构):

好文章,来自【福优学苑@音视频+流媒体】

FFmpeg入门详解之19:音视频封装原理简介_第1张图片

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

  • ftyp:File Type Box,文件类型

  • moov:Movie Box,文件媒体的 metadata 信息

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

    一个 MP4 文件有且仅有一个 “ftyp” 类型的 box,作为 MP4 格式的标识并包含一些关于文件的一些信息;

    ftyp box 之后会有一个 “moov” 类型的 box(Movie Box),它是一种 container box,子 box 中包含了媒体的 metadata 信息;

    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 的文件结构分为头部、主体和索引三部分。 主体中图像数据和声音数据是交互存放的,从尾部的索引可以索引跳到自己想放的位置。

AVI 本身只是提供了这么一个框架,内部的图像数据和声音数据格式可以是任意的编码形式。因为索引放在了文件尾部,所以在播网络流媒体时已属力不从心。一个很简单的例子,从网络上下载 AVI 文件,如果没有下载完成,是很难正常播放出来。

1.1 基本数据单元

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

FFmpeg入门详解之19:音视频封装原理简介_第2张图片

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

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

1.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 文件结构

FFmpeg入门详解之19:音视频封装原理简介_第3张图片

TS 

TS 全称是 MPEG2-TS,MPEG2-TS 是一种标准容器格式,传输与存储音视频、节目与系统信息协议数据,广泛应用于数字广播系统,我们日常数字机顶盒接收到的就是 TS(Transport Stream,传输流)流。

首先需要先分辨 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)

    PS 流包结构长度可变,一旦某一 PS 包的同步信息丢失,接收机就无法确认下一包的同步位置,导致信息丢失,因此 PS 流适用于合理可靠的媒体,如光盘(DVD),PS 流的后缀名一般为 vob 或 evo。而 TS 传输流不同,TS 流的包结构为固定长度(一般为 188 字节),当传输误码破坏了某一 TS 包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免信息丢失,因此 TS 可适用于不太可靠的传输,即地面或卫星传播,TS 流的后缀一般为 ts、mpg、mpeg。

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

TS 流形成过程

FFmpeg入门详解之19:音视频封装原理简介_第4张图片

以电视数字信号为例:

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

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

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

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

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

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

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

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

FFmpeg入门详解之19:音视频封装原理简介_第5张图片

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 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。

    HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

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

因此,客户端获取 HLS 流文件,主要就是对 m3u8 文件进行解析操作。

那么,下面就简单介绍下 m3u8 文件。

M3U8 文件简介

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

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

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts

对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可

而对于直播来说,客户端需要定时重新请求 该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。

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

其格式如下所示:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8

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

你可能感兴趣的:(音视频,动画)