写给自己的音视频笔记- [视频基础]

33 阅读35分钟

1. 基本概念

  • PPI: Pixels Per Inch,每英寸像素数
  • RGB: 三原色,256×256×256=16777216种,因此也简称为1600万色.RGB三色,每色8bit,也被称为24位色

编码: 就是按指定的方法,将信息从一种形式转换成另一种形式
视频编码: 将一种视频格式转换成另一种视频格式

1.1 视频从录制到播放的整个过程:

image.png

1.2 YUV信号

YUV 就是另外一种颜色数字化表示方式. 视频通信系统之所以要采用 YUV,而不是 RGB,主要是因为 RGB 信号不利于压缩
在 YUV 这种方式里面,加入了亮度概念.
在最近几十年中,视频工程师发现,眼睛对于亮和暗的分辨要比对颜色的分辨更精细一些,也就是说,人眼对色度的敏感程度要低于对亮度的敏感程度.所以,工程师认为,在我们的视频存储中,没有必要存储全部颜色信号.
YUV 里面的“Y”,就是亮度(Luma),“U”和“V”则是色度(Chroma)。
大家偶尔会见到的 Y'CbCr,也称为 YUV,是 YUV 的压缩版本,不同之处在于 Y'CbCr用于数字图像领域,YUV 用于模拟信号领域,MPEG、DVD、摄像机中常说的 YUV 其实就是 Y'CbC
image.png

1.2.1 YUV采样方式总共有3种:

  • YUV 4:4:4
  • YUV 4:2:2
  • YUV 4:2:0

image.png image.png
YUV三个数分别含义:

  • 第一个数表示像素横向数量
  • 第二个数表示第一行像素的色度采样值
  • 第三个数表示第二行像素的色度采样值

通常用的是 YUV 4:2:0 的采样方式,能获得 1/2 的压缩率

1.2.2 RGB如何转换

image.png

1.2.3 通用的YUV图像格式有哪些?

根据YUV图像的亮度、分辨率定义了如下图格式 image.png

1.2.4 如何理解帧和场图像

帧:

简单的理解帧就是为视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧

视频帧又分为: I帧、B帧、P帧
I帧: 帧内编码帧

大多数情况下 I 帧就是关键帧,就是一个完整帧,无需任何辅助就能独立完整显示的画面.视频序列帧的第一个帧,始终都是I帧

B帧: 帧是双向预测帧

参考前后图像帧编码生成。需要前面的 I/P 帧或者后面的P 帧来协助形成一个画面。它的压缩率最高,可以达到200:1,不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)

image.png

P帧: 前向预测编码帧。是一个非完整帧,通过参考前面的 I 帧或 P 帧生成画面
image.png
I帧、P帧、B帧的小结:

  • 对 I 帧的处理,是采用帧内编码方式,只利用本帧图像内的空间相关性
  • 对 P 帧的处理,采用帧间编码(前向运动估计),同时利用空间和时间上的相关性

image.png
需要特别注意,I 帧(帧内编码),虽然只有空间相关性,但整个编码过程也不简单
image.png 如上图所示,整个帧内编码,还要经过 DCT(离散余弦变换)、量化、编码等多个过程
文字描述:

RGB 转 YUV:固定公式
图片宏块切割:宏块 16x16
DCT:离散余弦变换
量化:取样
ZigZag 扫描
DPCM:差值脉冲编码调制
RLE:游程编码
霍夫曼编码
算数编码

1.2.5 顶场和底场

一帧图像包含两场: 顶场、底场 image.png
逐行于隔行图像

逐行图像: 一帧图像的两场在同一时间得到,ttop=tbot。
隔行图像: 一帧图像的两场在不同时间得到, ttop≠tboot

1.2.6 码率/比特率

单位时间播放连续的媒体如压缩后的音频或视频的比特数量。常用单位“比特每秒”,缩写是“bit/s”。比特率越高,带宽消耗得越多.

比特率即码率,在不同领域有不同的含义,在多媒体领域,指单位时间播放音频或视频的比特数,可以理解成吞吐量或带宽。
单位为 bps , 即 bits per second,每秒传输的数据量,常用单位有:kbps、mbps等
计算公式:码率(kbps)= 文件大小(kb)/ 时长(s)
通俗一点理解就是取样率,取样率越大,精度就越高,图像质量越好,但数据量也越大,所以要找到一个平衡点:用最低的比特率达到最少的失真

(1) 动态比特率
简称为 VBR,即 Variable Bit Rate,比特率可以随着图像复杂程度的不同而随之变化。
图像内容简单的片段采用较小的码率,图像内容复杂的片段采用较大的码率,这样既保证了播放质量,又兼顾了数据量的限制
比如 RMVB 视频文件,其中的 VB 就是指 VBR,表示采用动态比特率编码方式,达到播放质量与体积兼得的效果
(2) 静态比特率
简称为 CBR,即 Constant Bit Rate,比特率恒定.
图像内容复杂的片段质量不稳定,图像内容简单的片段质量较好。 上面列出的计算公式显然是针对 CBR ,除 VBR 和 CBR 外,还有 CVBR(Constrained VariableBit Rate) 、ABR (Average Bit Rate) 等等

1.2.7 块和宏块

如果总是按照像素来算,数据量会比较大,所以,一般都是把图像切割为不同的“块(Block)”或“宏块(MacroBlock)”,对它们进行计算
一个宏块一般为 16像素 × 16像素
image.png

1.3 人类视觉系统HVS

色调H: 用角度度量,取值范围为 0°~360°,从红色开始按逆时针方向计算,红色为 0°,绿色为 120°,蓝色为 240°。它们的补色是:黄色为 60°,青色为 180°,品红为 30

    饱和度S: 饱和度 S 表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为 0,饱和度达到最高。通常取值范围为 0%~100%,值越大,颜色越饱和

    明度V: 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为 0%(黑)到 100%(白)

image.png
RGB 和 CMY 颜色模型都是面向硬件的,而 HSV(Hue Saturation Value)颜色模型是面向用户的.
HSV 模型的三维表示从 RGB 立方体演化而来。设想从 RGB 沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量
HVS特点:

  • 对高频信息不敏感
  • 对高对比度更敏感
  • 对亮度信息比色度信息更敏感
  • 对运动的信息更敏感

针对 HVS 的特点,数字视频系统的设计应该考虑哪些因素

  • 丢弃高频信息,只编码低频信息
  • 提高边缘信息的主观质量
  • 降低色度的解析度
  • 对感兴趣区域(Region of Interesting,ROI)进行特殊处理

1.4 视频文件格式、视频封装格式、视频编码方式

视频格式那么多,MP4/RMVB/MKV/AVI 等,这些视频格式与编码压缩标准 mpeg4,H.264.H.265 等有什么关系?
(1) 视频文件格式(简称 文件格式)

我们知道 Windows 系统中的文件名都有后缀,例如 1.doc,2.wps Windows 设置后缀名的目的是让系统中的应用程序来识别并关联这些文件,让相应的文件由相应的应用程序打开

(2) 视频封装格式(简称 视频格式)

AVI,MPEG,VOB 是一种视频封装格式,相当于一种储存视频信息的容器.它是由相应的公司开发出来的

我们可以在自己的电脑上看到的 1.avi,2.mpg,3.vob 这些视频文件格式的后缀名即采 用相应的视频封装格式的名称。以下集中介绍几种封装格式:

AVI,MPEG,VOB 是一种视频封装格式,相当于一种储存视频信息的容器.它是由相应的公司开发出来的 我们可以在自己的电脑上看到的 1.avi,2.mpg,3.vob 这些视频文件格式的后缀名即采 用相应的视频封装格式的名称。以下集中介绍几种封装格式:

AVI(后缀.avi)、QuickTime File Format格式(后缀.mov)、MPEG格式(后缀可以是.MPG .MPEG .MPE .DAT .VOB .ASF .3GP .MP4等)、WMV格式(后缀.WMV .ASF)、Flash Video格式(后缀.flv)

image.png

(3) 视频编码格式(简称 视频编码)

所谓视频编码方式就是指能够对数字视频进行压缩或者解压缩(视频解码)的程序或者设备。通常这种压缩属于有损数据压缩.
也可以指通过过特定的压缩技术,将某个视频格式转换成另一种视频格式。常见的编码方式有:

  1. H.26X 系列 (由 ITU[国际电传视讯联盟]主导)包括 H.261、H.262、H.263、H.264、H.265
  • H.261:主要在老的视频会议和视频电话产品中使用
  • H.263:主要用在视频会议、视频电话和网络视频上
  • H.264:H.264/MPEG-4 第十部分,或称 AVC(Advanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式
  • H.265:高效率视频编码(High Efficiency Video Coding,简称 HEVC)是一种视频压缩标准,H.264/MPEG-4 AVC 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到H.264/MPEG-4 AVC两倍之压缩率(等同于同样画面质量下比特率减少了50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。直至 2013 年,Potplayer 添加了对于 H.265 视频的解码,尚未有大众化编码软件出现
  1. MPEG 系列(由 ISO[国际标准组织机构]下属的 MPEG[运动图象专家组]开发 )视频编码方面主要有:
  • MPEG-1 第二部分(MPEG-1 第二部分主要使用在 VCD 上,有些在线视频也使用这种格式。该编解码器的质量大致上和原有的 VHS 录像带相当
  • MPEG-2 第二部分(MPEG-2 第二部分等同于 H.262,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统(cable distribution systems)中。
  • MPEG-4 第二部分(MPEG-4 第二部分标准可以使用在网络传输、广播和媒体存储上。比起 MPEG-2 和第一版的 H.263,它的压缩性能有所提高
  • MPEG-4 第十部分(MPEG-4 第十部分技术上和 ITU-TH.264 是相同的标准,有时候也被叫做“AVC”)最后这两个编码组织合作,诞生了 H.264/AVC 标准。ITU-T 给这个标准命名为 H.264,而 ISO/IEC 称它为 MPEG-4 高级视频编码(Advanced Video Coding,AVC)
  1. 其他系列: AMV · AVS · Bink · CineForm · Cinepak · Dirac · DV · Indeo · Video · Pixlet · RealVideo · RTVideo · SheerVideo · Smacker · Sorenson Video · Theora · VC-1 · VP3 · VP6 · VP7 · VP8 · VP9 · WMV 这些编码方式不常用

2. 音视频封装原理简介

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

数据封装: 笼统地讲,就是把业务数据映射到某个封装协议的净荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配
解封装: 就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业务信息数据封装和解封装是一对逆过程
image.png

2.2 视频数据的封装

对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装.
封装: 就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中.再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器
目前主要的视频容器有如下:

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

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

2.3 什么是音视频的封装格式

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

image.png

2.4 封装格式

封装格式业界也有人称音视频容器,比如我们经常看到的视频后缀名: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 等就是音频编码格式

image.png

  • 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 称为 containe box

    MP4 文件 box 以树形结构的方式组织, 一个简单的 MP4 文件由以下 box 结构数组 成(mp4info 工具查看 MP4 文件结构)

image.png 根节点之下,主要包含以下三个box结点:

  • ftyp:File Type Box,文件类型
  • moov: Movie Box,文件媒体的 metadata信息
  • mdat:Media Data Box,具体的媒体

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

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

mdat: 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. 基本数据单元

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

Chunks
typedef struct {
    DWORD dwFourCC
    DWORD dwSize    // data
    BYTE data[dwSize] // contains headers or video/audio data
} CHUNK;

Lists
typedef struct {
    DWORD dwList
    DWORD dwSize    // dwFourcc + data
    DWORD dwFourCC 
    BYTE data[dwSize - 4]    // contains Lists and Chunks
} LIST;

如上可知,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文件结构:
image.png

3. FLV
简介:

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

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

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

  • Header
    头部分由以下几部分组成 Signature(3 字节)+Version(1 字节)+Flags(1 字节)+DataOffset(4 字节)

  • 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 数据部分

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

TS传输流

首先需要先分辨 TS 传输流中几个基本概念.

  • ES(Elementary Stream):基本流,直接从编码器出来的数据流,可以是编码过的音频、视频或其他连续码流
  • PES(Packetized Elementar): 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 ProgramStream),一种是传输流(TS Transport Stream)

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

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

TS流形成过程
image.png

以电视数字信号为例:

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 用于解码器的系统时钟恢复

image.png

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

5. 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),其可能是一个媒体播放列表(MediaPlaylist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。

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

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9.009,
media.example.com/first.ts
#EXTINF:9.009,
media.example.com/second.ts
#EXTINF:3.003,
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"
example.com/low/index.m…
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
example.com/lo_mid/inde…
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
example.com/hi_mid/inde…
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
example.com/high/index.…
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
example.com/audio/index…

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

3. 视频编码原理

什么是视频编码?

定义: 通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式
视频数据在时域和空域层面都有极强的相关性,这也表示有大量的时域冗余信息和空域冗余信息,压缩技术就是去掉数据中的冗余信息

(1). 去除时域冗余信息

  • 运动补偿:通过先前的局部图像来预测、补偿当前的局部图像,可有效减少帧序列冗余信息
  • 运动表示:不同区域的图像使用不同的运动矢量来描述运动信息,运动矢量通过熵编码进行压缩(熵编码在编码过程中不会丢失信息)
  • 运动估计:从视频序列中抽取运动信息。 通用的压缩标准使用基于块的运动估计和运动补偿。

(2). 去除空域冗余信息

  • 变换编码: 将空域信号变换到另一正交矢量空间,使相关性下降,数据冗余度减小
  • 量化编码: 对变换编码产生的变换系数进行量化,控制编码器的输出位率
  • 熵编码: 对变换、量化后得到的系数和运动信息,进行进一步的无损压缩

image.png

什么是"编解码器"?

  • 编码器(Encoder):压缩信号的设备或程序;
  • 解码器(Decoder):解压缩信号的设备或程序;
  • 编解码器(Codec):编解码器对

编解码器的结束流程和原理

  • 编码
  • 变换
  • 量化
  • 熵编码

编解码中的关键流程 image.png

3.1 视频为何需要压缩?

原因:未经压缩的数字视频的数据量巨大

  • 存储困难: 1GB只能存储几秒钟的未压缩数字视频
  • 传输困难: 1 兆的带宽传输一秒的数字电视视频需要大约 4 分钟

image.png

计算公式:

一帧大小(字节): (176 × 144) × 12 / 8 = 38016(bytes)
一秒钟一帧文件大小小(字节): 38016 × 30 = 1140480(bytes)
一分钟文件大小: 60 × 1140480 = 68428800(bytes)

主要压缩了什么东西?
原始视频压缩的目的是去除冗余信息,可以去除的冗余包括:

  • 空间冗余:图像相邻像素之间有较强的相关性
  • 时间冗余:视频序列的相邻图像之间内容相似
  • 编码冗余:不同像素值出现的概率不同
  • 视觉冗余:人的视觉系统对某些细节不敏感
  • 知识冗余:规律性的结构可由先验知识和背景知识得到

3.2 数据压缩是怎么分类的?

  • 无损压缩: 压缩前、解压缩后图像完全一致 X=X',压缩比低(2:1~3:1)。典型格式例如:Winzip,JPEG-LS
  • 有损压缩: 压缩前解压缩后图像不一致 X≠X',压缩比高(10:1~20:1),利用人的视觉系统的特性。典型格式例如:MPEG-2,H.264/AVC,AVS

image.png

数据压缩分类

  • 无损压缩: 无损压缩也称为可逆编码,重构后的数据与原数据完全相同,适用于磁盘文件的压缩等。主要采用熵编码方式,包括香农编码、哈夫曼编码和算术编码等
    (1). 香农编码
    香农编码采用信源符号的累计概率分布函数来分配码字,效率不高,实用性不大,但对其他编码方法有很好的理论指导意义
    (2). 哈夫曼编码
    哈夫曼编码完全依据出现概率来构造异字头的平均长度最短的码字
    基本方法为:先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表
    编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中
    (3). 算术编码
    算术编码是用符号的概率和编码间隔两个基本参数来描述的,在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果
    使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码,估计越准,编码结果就越接近最优的结果
  • 压缩前解压缩后图像完全一致 X=X'

  • 压缩比低(2:1~3:1)

  • 例如:Winzip,JPEG-LS

  • 有损压缩: 有损压缩也称为不可逆编码,重构后的数据与原数据有差异,适用于任何允许有失真的场景,例如视频会议、可视电话、视频广播、视频监控等.
    编码方式包括预测编码、变换编码、量化编码、混合编码等
  • 压缩前解压缩后图像不一致 X≠X'
  • 压缩比高(10:1~20:1)
  • 利用人的视觉系统的特性
  • 例如:MPEG-2,H.264/AVC,AVS

3.3 H.264编码介绍

IPB帧:

I帧: 帧内编码帧(intra picture),采用帧内压缩去掉空间冗余信息
P帧: 前向预测编码帧(predictive-frame),通过将图像序列中前面已经编码帧的时间冗余信息来压缩传输数据量的编码图像。参考前面的 I 帧或者 P 帧
B帧: 双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的冗余信息,来压缩传输数据量的编码图像,也称为双向编码帧。参考前面一个的 I 帧或者 P 帧及其后面的一个 P 帧

PTS和DTS

DTS(Decoding Time Stamp): 是标识读入内存中 bit 流在什么时候开始送入解码器中进行解码。也就是解码顺序的时间戳
PTS(Presentation Time Stamp): 用于度量解码后的视频帧什么时候被显示出来。在没有B 帧的情况下,DTS 和 PTS 的输出顺序是一样的,一旦存在 B 帧,PTS 和 DTS 则会不同。也就是显示顺序的时间戳

GOP

即 Group of picture(图像组),指两个 I 帧之间的距离,Reference(参考周期)指两个 P 帧之间的距离

    一个 I 帧所占用的字节数大于一个 P 帧,一个 P 帧所占用的字节数大于一个 B 帧。所以在码率不变的前提下,GOP 值越大,P、B 帧的数量会越多,平均每个 I、P、B 帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference 越大,B 帧的数量越多,同理也更容易获得较好的图像质量

    简而言之: 字节大小:I > P > B 解码顺序:I > P > B

image.png

JVT(Joint Video Team,视频联合工作组)

三十多年以来,世界上主流的视频编码标准,基本上都是它们提出来的:
(1). ITU 提出了 H.261、H.262、H.263、H.263+、H.263++,这些统称为 H.26X 系列,主要应用于实时视频通信领域,如会议电视、可视电话等
(2). ISO/IEC 提出了 MPEG1、MPEG2、MPEG4、MPEG7、MPEG21,统称为 MPEG系列
ITU 和 ISO/IEC 一开始是各自捣鼓,后来,两边成立了一个联合小组,名叫 JVT(JointVideo Team,视频联合工作组)

image.png JVT致力于新一代视频编码标准的制定,后来推出了包括 H.264 在内的一系列标准
压缩率对比:
image.png
视频编码标准的发展关系 image.png


4. 视频播放原理

4.1 视频播放器简介

视频播放器播放一个互联网上的视频文件(本地文件),需要经过以下几个步骤

  • 解协议
  • 解封装
  • 解码视音频
  • 音视频同步

注意:“文件”本身也是一种“协议”
image.png

解协议

将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等

    这些协议在传输视音频数据的同时,也会传输一些信令数据。

    这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据

解封装

将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如 MP4,MKV,RMVB,TS,FLV,AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起

    例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流

解码

将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据

    音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等

    解码是整个系统中最重要也是最复杂的一个环节

    通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据

音视频同步

根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来