文章目录
- 前言
- 一、视频基础概念
-
- 1、图像基础知识
-
- ①、像素点
- [②、什么是 PPI](#②、什么是 PPI)
- ③、颜色在计算机里是如何表示的?
- 2、视频编码基础知识
- 3、数字视频
- [4、人类视觉系统 HVS](#4、人类视觉系统 HVS)
-
- [①、HVS 的构成](#①、HVS 的构成)
- [②、HVS 特点](#②、HVS 特点)
- [5、通用的 YUV 图像格式](#5、通用的 YUV 图像格式)
- 6、帧和场图像
- 7、逐行与隔行图像
- 8、几个基本概念
-
- ①、帧(Frame)
- ②、帧数
- [③、帧率(Frame Rate)](#③、帧率(Frame Rate))
- ④、刷新率
- ⑤、分辨率
- ⑥、码率/比特率
- ⑦、颜色模式(颜色空间)
- ⑧、视频文件格式、封装格式
- 二、音视频封装原理
- 三、视频编码原理
-
- 1、视频为何需要压缩?
- 2、主要压缩了什么东西?
- 3、数据压缩是怎么分类的?
- 4、视频编码
- 5、视频压缩编码技术
- [6、H.264 编码介绍](#6、H.264 编码介绍)
-
- [①、IPB 帧](#①、IPB 帧)
- [②、PTS 和 DTS](#②、PTS 和 DTS)
- ③、GOP
- 四、视频播放原理
- 五、视频转码原理
前言
本节对视频相关知识进行了详细的介绍及讲解。
一、视频基础概念
1、图像基础知识
①、像素点
说视频之前,先要说说图像。
图像,大家都知道,是由很多"带有颜色的点"组成的。这个点,就是"像素点"。
像素点的英文叫 Pixel(缩写为 PX)。像素是图像显示的基本单位。
我们通常说一幅图片的大小,例如是 1920×1080,就是宽度为 1920 个像素点,高度为 1080 个像素点。乘积是 2,073,600,也就是说,这个图片是两百万像素的。
1920×1080,这个也被称为这幅图片的分辨率。
分辨率也是显示器的重要指标
②、什么是 PPI
PPI,就是"Pixels Per Inch",每英寸像素数。也就是,手机(或显示器)屏幕上每英寸面积,到底能放下多少个"像素点"。
PPI 越高,图像就越清晰细腻。
③、颜色在计算机里是如何表示的?
三原色:红色(Red) 、绿色( Green) 、蓝色( Blue)
在计算机里,R、G、B 也被称为"基色分量 "。它们的取值,分别从 0 到 255,一共 256 个等级(256 是 2 的 8 次方) 。
通过这种方式, 一共能表达多少种颜色呢?
256×256×256=16,777,216 种, 因此也简称为 1600 万色。
RGB 三色,每色有 8bit,这种方式表达出来的颜色,也被称为 24 位色(占用 24bit) 。
2、视频编码基础知识
基本介绍之前的博文已有讲解,这里不再赘述,参考音视频入门基础理论知识
①、编码
编码:就是按指定的方法,将信息从一种形式(格式) ,转换成另一种形式(格式) 。
视频编码:就是将一种视频格式,转换成另一种视频格式。
编码的终极目的,说白了,就是为了压缩。
视频从录制到播放的整个过程,如下:
②、YUV
视频通信系统之所以要采用 YUV,而不是 RGB,主要是因为 RGB 信号不利于压缩。
主流的采样方式有三种:
- YUV4:4:4
- YUV4:2:2
- YUV4:2:0
通常用的是 YUV4:2:0 的采样方式, 能获得 1/2 的压缩率。
3、数字视频
数字视频可以理解为自然场景空间和时间的数字采样表示。
- 空间采样的主要技术指标为:解析度(Resolution)
- 时间采样的主要技术指标为:帧率(帧/秒)
4、人类视觉系统 HVS
①、HVS 的构成
- 眼睛
- 神经
- 大脑
②、HVS 特点
- 对高频信息不敏感
- 对高对比度更敏感
- 对亮度信息比色度信息更敏感
- 对运动的信息更敏感
针对 HVS 的特点, 数字视频系统的设计应该考虑哪些因素?
- 丢弃高频信息, 只编码低频信息
- 提高边缘信息的主观质量
- 降低色度的解析度
- 对感兴趣区域(Region of Interesting, ROI)进行特殊处理
5、通用的 YUV 图像格式
根据 YUV 图像的亮度、分辨率定义了如下图像格式:
6、帧和场图像
一帧图像包括两场------顶场,底场:
7、逐行与隔行图像
- 逐行图像是指:一帧图像的两场在同一时间得到,ttop=tbot。
- 隔行图像是指:一帧图像的两场在不同时间得到,ttop≠tbot。
8、几个基本概念
①、帧(Frame)
既然视频是由许多静态图片组成的,那么视频的每一张静态图片就叫一帧。
视频帧又分为 I 帧、 B 帧和 P 帧:
- I 帧:帧内编码帧,大多数情况下 I 帧就是关键帧,就是一个完整帧,无需任何辅助就能独立完整显示的画面。
- B 帧:帧是双向预测帧。参考前后图像帧编码生成。需要前面的 I/P 帧或者后面的 P 帧来协助形成一个画面。
- P 帧:前向预测编码帧。是一个非完整帧,通过参考前面的 I 帧或 P 帧生成画面。
②、帧数
帧数其实就是为帧生成数量的简称,可以解释为静止画面的数量。
定义:用于测量显示帧数的量度。单位为 FPS(Frames per Second, 每秒显示帧数)或赫兹(Hz) 。
帧率越高,画面越流畅、逼真,对显卡的处理能力要求越高,数据量越大。
③、帧率(Frame Rate)
帧率(Frame rate) = 帧数(Frames)/时间(Time), 单位为帧每秒(f/s,frames per second,fps)。
- 10~12 FPS:由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约 10 至 12 帧的时候,就会认为是连贯的,此现象称之为视觉暂留。
- 24 FPS:一般电影的拍摄及播放帧数是每秒 24 帧。
- 60 FPS:这个帧率对人眼识别来说已经具备较高的平滑度。
- 85 FPS:人类大脑处理视频的极限,人眼无法分辨更高频率的差异。
60 FPS:在做页面性能优化时,常用 60FPS 作为一个基准,所以需要尽量让每一帧的渲染控制在 16ms 内, 这样才能达到一秒 60 帧的流畅度。
④、刷新率
屏幕每秒画面被刷新的次数,分为垂直刷新率和水平刷新率,一般我们提到的都是指垂直刷新率,以赫兹(Hz)为单位,刷新率越高,图像就越稳定,图像显示就越自然清晰。
目前,大多数显示器根据其设定按 30Hz、60Hz、120Hz 或者 144Hz 的频率进行刷新。 而其中最常见的刷新频率是 60 Hz。这样做是为了继承以前电视机刷新频率为 60Hz 的设定。
⑤、分辨率
视频、图片的画面大小或尺寸。分辨率是以横向和纵向的像素数量来衡量的,表示平面图像的精细程度。
视频精细程度并不只取决于视频分辨率,还取决于屏幕分辨率
1080P 的 P 指 Progressive scan( 逐行扫描) ,即垂直方向像素点,也就是 "高",所以 1920X1080 叫 1080P,不叫 1920P。
当 720P 的视频在 1080P 屏幕上播放时,需要将图像放大,放大操作也叫上采样。
⑥、码率/比特率
单位时间播放连续的媒体如压缩后的音频或视频的比特数量。常用单位"比特每秒",缩写是"bit/s"。比特率越高,带宽消耗得越多。
比特率即码率,在不同领域有不同的含义,在多媒体领域,指单位时间播放音频或视频的比特数,可以理解成吞吐量或带宽。
单位为 bps,即 bits per second,每秒传输的数据量,常用单位有:kbps、mbps 等
计算公式: 码率(kbps)= 文件大小(kb) / 时长(s)
<1>、动态比特率
简称为 VBR,即 Variable Bit Rate,比特率可以随着图像复杂程度的不同而随之变化。图像内容简单的片段采用较小的码率,图像内容复杂的片段采用较大的码率,这样既保证了播放质量,又兼顾了数据量的限制。
<2>、静态比特率
简称为 CBR, 即 Constant Bit Rate, 比特率恒定。图像内容复杂的片段质量不稳定, 图像内容简单的片段质量较好。
⑦、颜色模式(颜色空间)
RGB 和 YUV 这里不再赘述,我们讲一下 HSV
HSV
- 色调 H:用角度度量,取值范围为 0°~360°,从红色开始按逆时针方向计算,红色为 0°,绿色为 120°,蓝色为 240°。它们的补色是:黄色为 60°,青色为 180°,品红为 300°;
- 饱和度 S:饱和度 S 表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为 0,饱和度达到最高。通常取值范围为 0%~100%,值越大,颜色越饱和。
- 明度 V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对物体色,此值和物体的透射比或反射比有关。通常取值范围为 0%(黑) 到 100%(白) 。
HSV 模型的三维表示从 RGB 立方体演化而来。设想从 RGB 沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。 六边形边界表示色彩, 水平轴表示纯度,明度沿垂直轴测量。
⑧、视频文件格式、封装格式
- 视频文件格式(简称:文件格式)
- 视频封装格式(简称:视频格式)
- 视频编码方式(简称:视频编码)
<1>、视频文件格式
常见的视频文件格式如 1.avi,2.mpg 这些都叫做视频的文件格式,它由你电脑上安装的视频播放器关联。
<2>、视频封装格式
AVI,MPEG,VOB 是一种视频封装格式,相当于一种储存视频信息的容器。
- AVI 格式(后缀为 .AVI):它的英文全称为 Audio Video Interleaved,即音频视频交错格式。这种视频格式的优点是图像质量好。由于无损 AVI 可以保存 alpha 通道,经常被我们使用。缺点太多,体积过于庞大,而且更加糟糕的是压缩标准不统一。
- DV-AVI 格式(后缀为 .AVI):DV 的英文全称是 Digital Video Format,是由索尼、松下、 JVC 等多家厂商联合提出的一种家用数字视频格式。数字摄像机就是使用这种格式记录视频数据的。
- QuickTime File Format 格式(后缀为 .MOV):具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。
- MPEG 格式(文件后缀可以是 .MPG .MPEG .MPE .DAT .VOB .ASF .3GP .MP4等) :
MPEG 文件格式是运动图像压缩算法的国际标准。MPEG 格式目前有三个压缩标准,分别是 MPEG-1、MPEG-2、和 MPEG-4。 - WMV 格式(后缀为 .WMV .ASF) :WMV 格式的主要优点包括:本地或网络回放,丰富的流间关系以及扩展性等。
- Flash Video 格式(后缀为.FLV) :随着视频网站的丰富, 这个格式已经非常普及。
- Matroska 格式( 后缀为.MKV):是一种新的多媒体封装格式, 这个封装格式可把多种不同编码的视频及 16 条或以上不同格式的音频和语言不同的字幕封装到一个 Matroska Media 档内。Matroska 同时还可以提供非常好的交互功能, 而且比 MPEG 的方便、 强大。
常用视频格式及对应的文件格式:
视频封装格式 | 视频文件格式 |
---|---|
AVI(Audio Video Interleave) | AVI |
WMV(Windows Media Video) | WMV |
MPEG(Moving Picture Expert Group)分为 MPEG-1,MPEG-2,MPEG-4 | MPG MPEG VOB DAT 3GP MP4 |
Matroska | MKV |
Real Video | RM RMVB |
QuickTime File Format | MOV |
Flash Video | FLV |
<3>、视频编码方式(简称:视频编码)
所谓视频编码方式就是指能够对数字视频进行压缩或者解压缩( 视频解码)的程序或者设备。通常这种压缩属于有损数据压缩。
也可以指通过过特定的压缩技术,将某个视频格式转换成另一种视频格式。常见的编码方式有:
- 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 分辨率),这是目前发展的趋势。
- 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 标准。
- 其他系列:
- 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。
视频的编码格式才是一个视频文件的本质所在,不要简单的通过文件格式和封装形式来区分视频。
二、音视频封装原理
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 文件结构):
根节点之下,主要包含以下三个 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 文件结构图如下:
③、FLV
<1>、简介
FLV( Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了 FLV 格式。另外由于当前浏览器与 Flash Player 紧密的结合,使得网页播放 FLV 视频轻而易举,也是 FLV 流行的原因之一。
FLV 是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV 包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的 Tag 及 Tag Size 对组成。
<2>、FLV 格式解析
先来一张图, 这是《东风破》 ------周杰伦(下载) 的一个 MV 视频。我使用的是 Binary Viewer 的二进制查看工具。
- 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 流形成过程
以电视数字信号为例:
- 原始音视频数据经过压缩编码得到基本流 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 用于解码器的系统时钟恢复。
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 编码
当 m3u8 文件作为媒体播放列表(Meida Playlist) 时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。其格式如下所示:
对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要定时重新请求该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。
当 m3u8 作为主播放列表(Master Playlist) 时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Stream) 。
该备用流资源指定了多种不同码率,不同格式的媒体播放列表,并且,该备用流资源也可同时提供不同版本的资源内容, 比如不同语言的音频文件, 不同角度拍摄的视屏文件等等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。
三、视频编码原理
1、视频为何需要压缩?
原因:未经压缩的数字视频的数据量巨大
2、主要压缩了什么东西?
原始视频压缩的目的是去除冗余信息,可以去除的冗余包括:
- 空间冗余:图像相邻像素之间有较强的相关性
- 时间冗余:视频序列的相邻图像之间内容相似
- 编码冗余:不同像素值出现的概率不同
- 视觉冗余:人的视觉系统对某些细节不敏感
- 知识冗余:规律性的结构可由先验知识和背景知识得到
3、数据压缩是怎么分类的?
①、无损压缩(Lossless)
- 压缩前、解压缩后图像完全一致 X=X'
- 压缩比低(2:1~3:1)
- 典型格式例如:Winzip,JPEG-LS。
②、有损压缩(Lossy)
- 压缩前解压缩后图像不一致 X≠X'
- 压缩比高(10:1~20:1)
- 利用人的视觉系统的特性
- 典型格式例如:MPEG-2,H.264/AVC, AVS。
4、视频编码
①、定义
定义:通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式。
视频数据在时域和空域层面都有极强的相关性,这也表示有大量的时域冗余信息和空域冗余信息,压缩技术就是去掉数据中的冗余信息。
<1>、去除时域冗余信息
- 运动补偿:通过先前的局部图像来预测、补偿当前的局部图像,可有效减少帧序列冗余信息。
- 运动表示:不同区域的图像使用不同的运动矢量来描述运动信息,运动矢量通过熵编码进行压缩( 熵编码在编码过程中不会丢失信息)。
- 运动估计:从视频序列中抽取运动信息。通用的压缩标准使用基于块的运动估计和运动补偿。
<2>、去除空域冗余信息
- 变换编码:将空域信号变换到另一正交矢量空间,使相关性下降,数据冗余度减小。
- 量化编码:对变换编码产生的变换系数进行量化,控制编码器的输出位率。
- 熵编码:对变换、量化后得到的系数和运动信息,进行进一步的无损压缩。
②、编解码器
- 编码器(Encoder):压缩信号的设备或程序;
- 解码器(Decoder):解压缩信号的设备或程序;
- 编解码器(Codec):编解码器对。
<1>、编码器中的关键技术
- 预测
- 变换
- 量化
- 熵编码
<2>、编码器中的关键流程
5、视频压缩编码技术
视频压缩编码技术可分为两大类:无损压缩和有损压缩。
①、无损压缩
无损压缩也称为可逆编码,重构后的数据与原数据完全相同,适用于磁盘文件的压缩等。主要采用熵编码方式,包括香农编码、 哈夫曼编码和算术编码等。
- 香农编码
- 香农编码采用信源符号的累计概率分布函数来分配码字,效率不高,实用性不大,但对其他编码方法有很好的理论指导意义。
- 哈夫曼编码
- 哈夫曼编码完全依据出现概率来构造异字头的平均长度最短的码字。
- 基本方法为:先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。
- 编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。
- 算术编码
- 算术编码是用符号的概率和编码间隔两个基本参数来描述的,在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。
- 使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码,估计越准,编码结果就越接近最优的结果。
②、有损压缩
有损压缩也称为不可逆编码,重构后的数据与原数据有差异,适用于任何允许有失真的场景,例如视频会议、可视电话、视频广播、视频监控等。
编码方式包括预测编码、变换编码、量化编码、混合编码等。
6、H.264 编码介绍
①、IPB 帧
- I 帧:帧内编码帧(intra picture),采用帧内压缩去掉空间冗余信息。
- 是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是 I 帧。
- P 帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已经编码帧的时间冗余信息来压缩传输数据量的编码图像。 参考前面的 I 帧或者 P 帧。
- "帧间预测编码帧",需要参考前面的 I 帧和/或 P 帧的不同部分,才能进行编码。P 帧对前面的 P 和 I 参考帧有依赖性。但是,P 帧压缩率比较高,占用的空间较小。
- B 帧:双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的冗余信息,来压缩传输数据量的编码图像,也称为双向编码帧。参考前面一个的 I 帧或者 P 帧及其后面的一个 P 帧。
- "双向预测编码帧",以前帧后帧作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到 200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)。
②、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
GOP 解码案例:
四、视频播放原理
1、视频播放器简介
视频播放器播放一个互联网上的视频文件(本地文件),需要经过以下几个步骤:
- 解协议
- 解封装
- 解码视音频
- 视音频同步
①、解协议
将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等。
这些协议在传输视音频数据的同时,也会传输一些信令数据。
这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。 解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。
②、解封装
将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如 MP4,MKV, RMVB,TS,FLV,AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。
③、解码
将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等。
解码是整个系统中最重要也是最复杂的一个环节。
通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
2、FFmpeg 播放原理
①、ffmpeg 架构
②、ffmpeg 解码流程
- 注册所有容器格式和 CODEC:av_register_all()
- 打开文件:av_open_input_file()
- 从文件中提取流信息:av_find_stream_info()
- 穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO
- 查找对应的解码器:avcodec_find_decoder()
- 打开编解码器:avcodec_open()
- 为解码帧分配内存:avcodec_alloc_frame()
- 不停地从码流中提取出帧数据:av_read_frame()
- 判断帧的类型,对于视频帧调用:avcodec_decode_video()
- 解码完后,释放解码器:avcodec_close()
- 关闭输入文件:av_close_input_file()
3、VLC 视频播放原理
几乎所有的视频播放器,如 VLC、MPlayer、Xine,包括 DirectShow,在播放视频的原理和架构上都是非常相似的,理解这个对理解 VLC 的源码会有事半功倍的效果。
大致的来说, 播放一个视频分为 4 个步骤:
- acess 访问,或者理解为接收、获取、得到
- demux 解复用,就是把通常合在一起的音频和视频分离(还有可能的字幕)
- decode 解码,包括音频和视频的解码
- output 输出,也分为音频和视频的输出(aout 和 vout)
①、acess 访问
拿播放一个 UDP 组播的 MPEG TS 流来说吧,access 部分负责从网络接收组播流,放到 VLC 的内存缓冲区中,access 模块关注 IP 协议,如是否 IPv6、组播地址、组播协议、端口等信息;如果检测出来是 RTP 协议(RTP 协议在 UDP 头部简单得加上了固定 12 个字节的信息),还要分析 RTP 头部信息。这部分可以参看 VLC 源码 /modules/access/udp.c 。在同目录下还可以看到大量的 access 模块,如 file、http、dvd、ftp、smb、tcp、dshow、mms、v4l...等等
②、demux 解复用
而 demux 部分首先要解析 TS 流的信息。TS 格式是 MPEG2 协议的一部分,概括地说,TS 通常是固定 188 字节的一个 packet,一个 TS 流可以包含多个 program(节目),一个program 又可以包含多个视频、音频、和文字信息的 ES 流;每个 ES 流会有不同的 PID 标示。而又为了可以分析这些 ES 流,TS 有一些固定的 PID 用来间隔发送 program 和 es 流信息的表格: PAT 和 PMT 表。 关于 TS 格式的详细信息可以去 google 一下。
VLC 专门做了一个独立的库 libdvbpsi 来解析和编码 TS 流,而调用它的代码可以参见 VLC 源码 /modules/demux/ts.c。
其实之所以需要 demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装格式也就有了 demux。
demux 分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间,而且冗余度较高的数据,通常在制作的时候就会进行某种压缩。这就是我们熟知的音视频编码格式,包括 MPEG1(VCD)、MPEG2(DVD)、 MPEG4、H.264、rmvb 等等。音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。VLC 解码 MPEG2 使用了一个独立的库 libmpeg2,调用它的源文件是 /modules/codec/libmpeg2.c。VLC 关于编解码的模块都放在 /modules/codec 目录下, 其中包括著名的庞大的 ffmpeg。
③、解码器
解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到, 还需要一个视频输出的模块。当然可以像一个 Win32 窗口程序那样直接把图像画到窗口 DC 上------VLC 的一个输出模块 WinGDI 就是这么干的,但是通常这太慢了,而且消耗大量的 CPU。在 Windows 下比较好的办法是用 DirectX 的接口,会自动调用显卡的加速功能。
五、视频转码原理
1、视频转码
视频转码是指将已经压缩编码的视频码流转换成另一个视频码流,以适应不同的网络带宽、不同的终端处理能力和不同的用户需求。
转码本质上是一个先解码,再编码的过程,因此转换前后的码流可能遵循相同的视频编码标准, 也可能不遵循相同的视频编码标准。
2、视频转码技术
视频转码技术使用的目的不同,其实现的手段也各不相同。大致上可以分为两类:
①、不同编码格式之间的视频数据转码
不同编码格式之间的数据转码,指通过转码方法改变视频数据的编码格式。通常这种数据转码会改变视频数据的现有码流和分辨率。
例如我们可以将基于 MPEG-2 格式的视频数据转换为 DV 、MPEG-4 或其它编码格式,同时根据其转码目的,指定转码产生视频数据的码流和分辨率。
这种转码方式设计的算法较为复杂,其实质上是一个重新编码的过程,涉及的算法复杂度和系统开销,是由转码所需图像质量要求及转码前后两种编码方式的相关度所决定的。
②、相同编码格式之间的视频数据转码
相同编码格式的数据转码,指不改变压缩格式,只通过转码手段改变其码流或头文件信息。
根据其使用目的, 可分为改变码流和不改变码流两种。
如我们可以将 MPEG-2 全 I 帧 50Mbps 码流的视频数据转码为 MPEG-2 IBBP 帧 8Mbps 码流的视频数据,直接用于播出服务器用于播出。
3、非线性编辑
非线性编辑是借助计算机来进行数字化制作,几乎所有的工作都在计算机里完成,不再需要那么多的外部设备,对素材的调用也是瞬间实现,不用反反复复在磁带上寻找 ,突破单一的时间顺序编辑限制,可以按各种顺序排列,具有快捷简便、随机的特性。
非线性编辑只要上传一次 就可以多次的编辑,信号质量始终不会变低,所以节省了设备、人力,提高了效率。
- 传统线性视频编辑是按照信息记录顺序,从磁带中重放视频数据来进行编辑,需要较多的外部设备,如放像机、录像机、特技发生器、字幕机,工作流程十分复杂。
- 非线性编辑系统是指把输入的各种视音频信号进行 A/D(模/数)转换,采用数字压缩技术将其存入计算机硬盘中。
- 非线性编辑没有采用磁带,而是使用硬盘作为存储介质,记录数字化的视音频信号,由于硬盘可以满足在 1/25s(PAL) 内完成任意一副画面的随机读取和存储,因此可以实现视音频编辑的非线性。
我的qq:2442391036,欢迎交流!