目录
- 一、内容元素
- 二、基础概念
- 2.1、视频封装格式
- 2.2、视频的编码格式
- 2.2.1、视频编解码的主要影响因数
- 1)视频质量
- 2)视频码率
- 3)算法复杂度
- 4)鲁棒性
- 2.2.2、常见的编码方式
- 1)H.26X 系列
- 2)MPEG 系列
- 2.3、音频编码方式
- 2.3.1、AAC:Advanced Audio Coding
- 2.3.2、MP3:MPEG-1 or MPEG-2 Audio Layer III
- 2.3.3、WMA:Windows Media Audio
- 2.4、iOS视频编解码常用库比较
- 三、直播/小视频中的编码格式
- 3.1、视频编码格式
- 3.2、音频编码格式:
- 四、H264编码
- 4.1、 图像
- 4.2、片(Slice)
- 4.3、宏块(Macroblock):
- 五、帧
- 5.1、I帧(I-frames,也叫关键帧)
- 5.2、P帧(P-frames,又称为预测帧)
- 5.3、B帧(B-frames,又称为双向帧)
- 5.4、GOP一组帧
- 六、视频码率
- 6.1、概念
- 6.2、算法
- 6.3、特点
- 6.3、码率控制
- 1)调节编码的帧率
- 2)调节图像大小
- 3)调节量化参数
- 七、视频的硬编码和软编码
- 7.1、定义
- 7.2、优缺点
- 7.3、目前的主流GPU加速平台
- 7.4、目前主流的GPU平台开发框架
- 八、iOS视频开发
- 九、矩证
一、内容元素
一个视频文件的内容有哪些元素,通过下图可以表现出来:
内容元素:
- 封装容器: MP4/MOV/FLV/RM/RMVB/AVI
- 图像(Image)
- ⾳频(Audio)
- 编码格式:
Video: H264
Audio: AAC - 元信息(Metadata)
了解了视频文件的基本内容元素,下面来了解一下这些内容元素的基本概念:
二、基础概念
我们知道word文件的后缀名有doc,图片的后缀名有.png/.jpg等,而常见视频文件的后缀名有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb 等等。这些后缀名通常在操作系统上需要用相应的应用程序打开,比如.doc用word打开。
通过以上类比,对于视频来说:不同的视频封装格式,最终生成的视频文件格式不同。
2.1、视频封装格式
视频封装格式: 又称视频格式、封装格式。就是将已经编码压缩好的视频数据、音频数据按照一定的解码方式放到一个文件中,这个文件可以称为容器或外壳。通常我们不仅仅只存放音频数据和视频数据,还会存放一些与视频同步的元数据。例如字幕,这些数据会由不同的程序来处理,但是它们在传输和存储的时候,这些种数据都是被绑定在一起的。一种封装格式反应一种视频的文件格式。
下面简单介绍下各视频封装格式的优缺点:
1、AVI 格式
这种视频格式的优点是图像质量好,无损 AVI 可以保存 alpha 通道。缺点是体积过于庞大,并且压缩标准不统一,存在较多的高低版本兼容问题。
2、WMV 格式
可以直接在网上实时观看视频节目的文件压缩格式。在同等视频质量下,WMV 格式的文件可以边下载边播放,因此很适合在网上播放和传输。
3、MPEG 格式
为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。
4、Matroska 格式
是一种新的视频封装格式,它可将多种不同编码的视频及 16 条以上不同格式的音频和不同语言的字幕流封装到一个 Matroska Media 文件当中。
5、Real Video 格式
用户可以使用 RealPlayer 根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。
6、QuickTime File Format 格式
是 Apple 公司开发的一种视频格式,默认的播放器是苹果的 QuickTime。这种封装格式具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。
7、Flash Video 格式
Adobe Flash 延伸出来的一种网络视频封装格式。这种格式被很多视频网站所采用。
2.2、视频的编码格式
视频编解码的过程是指对数字视频进行压缩或解压缩的一个过程。
在做视频编解码时,需要考虑以下这些因素的平衡:
2.2.1、视频编解码的主要影响因数
1)视频质量
2)视频码率
用来表示视频所需要的数据量(通常称之为码率)
3)算法复杂度
编码算法和解码算法的复杂度
4)鲁棒性
针对数据丢失和错误的鲁棒性(Robustness: 稳健性;健壮性)
- 编辑的方便性
- 随机访问
- 编码算法设计的完美性
- 端到端的延时以及其它一些因素
2.2.2、常见的编码方式
1)H.26X 系列
由国际电联(ITU-T)主导,包括 H.261、H.262、H.263、H.264、H.265
- H.261:主要用于老的视频会议和视频电话系统。是第一个使用的数字视频压缩标准。实质上说,之后的所有的标准视频编解码器都是基于它设计的。
- H.262:等同于 MPEG-2 第二部分,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统中。
- H.263:主要用于视频会议、视频电话和网络视频相关产品。在对逐行扫描的视频源进行压缩的方面,H.263 比它之前的视频编码标准在性能上有了较大的提升。尤其是在低码率端,它可以在保证一定质量的前提下大大的节约码率。
- H.264:等同于 MPEG-4 第十部分,也被称为高级视频编码(Advanced Video Coding,简称 AVC),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。
- H.265,被称为高效率视频编码(High Efficiency Video Coding,简称 HEVC)是一种视频压缩标准,是 H.264 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到 H.264 两倍的压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。
注: 当前不建议用H.265是因为太过于消耗CPU,而且目前H.264已经满足了大多的视频需求,虽然H.265是H.264的升级版,期待后续硬件跟上
2)MPEG 系列
由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)开发
- MPEG-1 第二部分:主要使用在 VCD 上,有些在线视频也使用这种格式。该编解码器的质量大致上和原有的 VHS 录像带相当。
- MPEG-2 第二部分:等同于 H.262,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统中。
- MPEG-4 第二部分:可以使用在网络传输、广播和媒体存储上。比起 MPEG-2 第二部分和第一版的 H.263,它的压缩性能有所提高。
- MPEG-4 第十部分:等同于 H.264,是这两个编码组织合作诞生的标准。
其他,AMV、AVS、Bink、CineForm 等等,这里就不做多的介绍了。
可以把「视频封装格式」看做是一个装着视频、音频、「视频编解码方式」等信息的容器。
一种「视频封装格式」可以支持多种「视频编解码方式」,比如:QuickTime File Format(.MOV) 支持几乎所有的「视频编解码方式」,MPEG(.MP4) 也支持相当广的「视频编解码方式」。
当我们看到一个视频文件名为 test.mov 时,我们可以知道它的「视频文件格式」是 .mov,也可以知道它的视频封装格式是 QuickTime File Format,但是无法知道它的「视频编解码方式」。那比较专业的说法可能是以 A/B 这种方式,A 是「视频编解码方式」,B 是「视频封装格式」。比如:一个 H.264/MOV 的视频文件,它的封装方式就是 QuickTime File Format,编码方式是 H.264。
2.3、音频编码方式
视频中除了画面通常还有声音,所以这就涉及到音频编解码。在视频中经常使用的音频编码方式有:
2.3.1、AAC:Advanced Audio Coding
是由 Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,在 1997 年推出的基于 MPEG-2 的音频编码技术。2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。
2.3.2、MP3:MPEG-1 or MPEG-2 Audio Layer III
是当曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。
2.3.3、WMA:Windows Media Audio
英文全称 Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。
2.4、iOS视频编解码常用库比较
库名 | 简介 | 需要的能力 | 官网链接 |
ffmpeg | FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。 | 了解视频编解码原理和流程、了解图像压缩技术、音频压缩技术等 | |
live555 | Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。 | 了解视频编解码原理和流程、了解图像压缩技术、音频压缩技术等 | |
MobileVLCKit | 鼎鼎大名的播放器VLC,优秀的封装,源码中最核心的部分,被封装成了独立的库,基于ffmpeg,live555提供完整的媒体播放库,你只需要定制自己的界面,支持CocoaPods导入库,开发一个简单界面的播放器,你只需要几行代码,几乎覆盖所有媒体格式! | 你只需要定制好自己的界面,它的API看起来就是一个播放器 | |
如果是播放标准协议的视频流(http,rtsp,ftp等),建议使用VLC,这个库有600M左右,兼容armv7 armv7s arm64的情况下,编译后大约会增加15~20M左右的体积。
使用pod引入的话,非常简单,省去了编译烦恼。
pod 'MobileVLCKit'
如果你要做精细的视频解码控制,或者要优化程序的体积,或者说你喜欢折腾!那么可以选用ffmpeg或者live555。
要做视频编码的话,使用ffmpeg会得到很好的支持!
三、直播/小视频中的编码格式
3.1、视频编码格式
H264编码的优势:
- 低码率:和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。
- 高质量的图像:H.264能提供连续、流畅的高质量图象(DVD质量)。
- 容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。
- 网络适应性强:H.264提供了网络抽象层(Network Abstraction Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。
总结: H264最大的优势,具有很高的数据压缩比率,在同等图像质量下,H264的压缩比是MPEG-2的2倍以上,MPEG-4的1.5~2倍。
举例: 原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。
3.2、音频编码格式:
AAC是目前比较热门的有损压缩编码技术,并且衍生了LC-AAC,HE-AAC,HE-AAC v2 三种主要编码格式.
LC-AAC 是比较传统的AAC,主要应用于中高码率的场景编码(>= 80Kbit/s)。
HE-AAC 主要应用于低码率场景的编码(<= 48Kbit/s)。
优势: 在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。
适合场景: 于128Kbit/s以下的音频编码,多用于视频中的音频轨的编码。
四、H264编码
H.264 是现在广泛采用的一种编码方式。当我们需要对发送的视频文件进行编码时,只要是H264文件,AVFoundation都提供视频编解码器支持,这个标准被广泛应用于消费者视频摄像头捕捉到的资源并成为网页流媒体视频最主要的格式。H264规范是MPEG4定义的一部分,H264遵循早期的MPEG-1/MPEG-2标准,但是在以更低比特率得到 更高图片质量方面有了进步。
关于 H.264 相关的概念,从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。
4.1、 图像
H.264 中,「图像」是个集合的概念,帧、顶场、底场都可以称为图像。一帧通常就是一幅完整的图像。
当采集视频信号时,如果采用逐行扫描,则每次扫描得到的信号就是一副图像,也就是一帧。
当采集视频信号时,如果采用隔行扫描(奇、偶数行),则扫描下来的一帧图像就被分为了两个部分,这每一部分就称为「场」,根据次序分为:「顶场」和「底场」。
「帧」和「场」的概念又带来了不同的编码方式:逐行扫描适合于运动图像,所以对于运动图像采用帧编码更好;隔行扫描适合于非运动图像,所以对于非运动图像采用场编码更好。
红色代表奇数行,绿色代表偶数行
4.2、片(Slice)
每一帧图像可以分为多个片,反过来,图像由多个片(片组)组成。
- NALU:网络抽象层单元(Network Abstraction Layer Unit)
NALU 是用来将编码的数据进行打包的,一个分片(Slice)可以编码到一个 NALU 单元。不过一个 NALU 单元中除了容纳分片(Slice)编码的码流外,还可以容纳其他数据,比如序列参数集 SPS。
对于客户端其主要任务则是接收数据包,从数据包中解析出 NALU 单元,然后进行解码播放。
4.3、宏块(Macroblock):
分片是由宏块组成。
五、帧
首先,我们先来了解一下人眼和视频摄像头的对帧的识别:
我们人眼看实物的时候,一般的一秒钟只要是连续的16帧以上,我们就会认为事物是动的,对于摄像头来说,一秒钟所采集的图片远远高于了16帧,可以达到几十帧,对于一些高质量的摄像头,一秒钟可以达到60帧,对于一般的事物来说,你一秒钟能改变多少个做动作?所以,当摄像头在一秒钟内采集视频的时候,前后两帧的图片数据里有大量的相同数据,对于这些数据我们该怎么处理了?当然前后两帧也有不同的数据,对于这些相同或者不同的数据的处理过程,就是编码。
举个栗子:
(具体大小没数过,只做讲解参考)
你的老公,Helen,将于明天晚上6点零5份在重庆的江北机场接你
----------------------23 * 2 + 10 = 56个字符--------------------------
你的老公将于明天晚上6点零5分在江北机场接你
----------------------20 * 2 + 2 = 42个字符----------------------------
Helen将于明天晚上6点在机场接你
----------------------10 * 2 + 2 = 26个字符----------------------------
通过以上例子,心里应该大概明白编码的本质:只要接收方不会产生误解,就可以压缩产生数据的承载量,编码视频的本质也是如此,编码的本质就是减少数据的冗余。
如对一张图片进行编码,其本质如下图:
下面来了解一些帧的概念:
5.1、I帧(I-frames,也叫关键帧)
我们知道在视频的传输过程中,它是分片段传输的,这个片段的第一帧,也就是第一张图片,就是I帧,也就是传说中的关键帧。
I帧: 也就是关键帧,帧内压缩(也就是压缩独立视频帧,被称为帧内压缩),帧内压缩通过消除包含在每个独立视频帧内的色彩以及结构中的冗余信息来进行压缩,因此可在不降低图片适量的情况下尽可能的缩小尺寸,这类似于JEPG压缩的原理,帧内压缩也可以称为有损压缩算法,但通常用于对不清晰的图片一部分进行处理,以生成极高质量的照片,通过这一过程的创建的帧称为I-frames。将第一帧完整的保存下来,如果没有这个关键帧后面解码数据,是完成不了的,所以I帧特别关键。
5.2、P帧(P-frames,又称为预测帧)
P帧:向前参考帧(在I帧(关键帧)后,P帧参考关键帧,保存下一帧和前一帧的不同数据).压缩时只参考前一个帧,属于帧间压缩技术。
帧间压缩技术:很多帧被组合在一起作为一组图片(简称GOP),对于GOP所存在的时间维度的冗余可以被消除,如果想象视频文件中的典型场景,就会有一些特定的运动元素的概念,比如行驶中的汽车或者街道上行走的路人,场景的背景环信通道是固定的,或者在一定的时间内,有些元素的改变很小或者不变,这些数据就称为时间上的冗余,这些数据就可以通过帧间压缩的方式进行消除,也就是帧间压缩,视频的第一帧会被作为关键帧完整保存下来。而后面的帧会向前依赖,也就是第二帧依赖于第一个帧,后面所有的帧只存储于前一帧的差异,这样就能将数据大大的减少,从而达到一个高压缩率的效果。这就是P帧,保存前后两帧不通的数据。
5.3、B帧(B-frames,又称为双向帧)
B帧,又叫双向帧,它是基于使用前后两帧进行编码后得到的帧,几乎不需要存储空间,但是解压过程会消耗较长的时间,因为它依赖周围其他的帧。
B帧的特点:B帧使得视频的压缩率更高,存储的数据量更小,如果B帧的数量越多,你的压缩率就越高。这是B帧的优点,但是B帧最大的缺点是,如果是实时互动的直播,那时与B帧就要参考后面的帧才能解码,那在网络中就要等待后面的帧传输过来。这就与网络有关了,如果网络状态很好的话,解码会比较快,如果网络不好时,解码会稍微慢一些,丢包时还需要重传。对实时互动的直播,一般不会使用B帧。
如果在泛娱乐的直播中,可以接受一定度的延时,需要比较高的压缩比就可以使用B帧。
如果我们在实时互动的直播,我们需要提高时效性,这时就不能使用B帧了。
5.4、GOP一组帧
如果在一秒钟内有30帧,这30帧可以画成一组。如果摄像机或者镜头它一分钟之内它都没有发生大的变化,那也可以把这一分钟内所有的帧画做一组。
GOP: 指一个I帧到下一个I帧这一组的数据,中间只包括B帧/P帧,我们称为GOP一组帧。
视频花屏/卡顿原因
我们平常在观看视频的时候,出现视频的花屏或者卡顿,第一反应就是我们的网络出现了问题,其实我们的网络没有问题,是我们在解码的时候I帧,B/P帧出现了丢失。
如果GOP分组中的P帧丢失就会造成解码端的图像发生错误(花屏)。为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失。就不显示本GOP内的所有帧,直到下一个I帧来后重新刷新图像。
当这时因为没有刷新屏幕,丢包的这一组帧全部扔掉了,图像就会卡在哪里不动,这就是卡顿的原因。
注:
花屏:是因为丢了P帧或者I帧,导致解码错误.。
卡顿:是因为为了怕花屏,将整组错误的GOP数据扔掉了,直达下一组正确的GOP再重新刷屏,而这中间的时间差,就是我们所感受的卡顿。
总结起来就是,不管花屏或卡顿都是因为数据丢失。
六、视频码率
6.1、概念
视频码率:就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件。
但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来的cbr(固定码率)与vbr(可变码率),都是在这方面做的文章,不过事情总不是绝对的,举例来看,对于一个音频,其码率越高,被压缩的比例越小,音质损失越小,与音源的音质越接近。
6.2、算法
码率(kbps)=文件大小(KB) * 8 / 时间(秒)
注: B注意有大小写区分。
6.3、特点
- 1、码率和质量成正比,但是文件体积也和码率成正比。
- 2、码率超过一定数值,对图像的质量没有多大影响。
- 3、DVD的容量有限,无论是标准的4.3G,还是超刻,或是D9,都有极限。
计算机中的信息都是二进制的0和1来表示,其中每一个0或1被称作一个位,用小写b表示,即bit(位);大写B表示byte,即字节,一个字节=八个位,即1B=8b;前面的大写K表示1024的意思,即1024个位(Kb)或1024个字节(KB)。表示文件的大小单位,一般都使用字节(KB)来表示文件的大小。 - Kbps:ps指的是/s,即每秒。
Kbps指的是网络速度,也就是每秒钟传送多少个千位的信息(K表示千位,Kb表示的是多少千个位),为了在直观上显得网络的传输速度较快,一般公司都使用kb(千位)来表示。1KB/S=8Kbps。ADSL上网时的网速是512Kbps,如果转换成字节,就是512/8=64KB/S(即64千字节每秒)。 - 4、一般来说,如果是1M的宽带,在网上只能看不超过1024kbps的视频,超过1024kbps的视频只能等视频缓冲才能流畅的观看。
6.3、码率控制
传统信源编码中的码率控制是通过改变码率的大小来获得不同的信源失真,而分布式信源编码(Distributed Source Coding,DSC)中的码率控制则是指在保证一定信源失真的前提下将码率降到最低。
在目前的技术,常用的调节码率手段包括:
1)调节编码的帧率
通过调节序列在时间上的分辨率达到控制码率的目的。当码率高于信道时,通过丢帧来降低码率;当码率低于信道时,可提高帧率以提高视觉效果。
2)调节图像大小
通过调节序列在空间上的分辨率来达到控制码率的目的。当码率高于信道时,减小尺寸来降低码率;当码率低于信道时,增加图像尺寸以获得更好的效果。
3)调节量化参数
编码残差系数的量化参数会直接影响到码率。量化参数变大,则编码的比特数降低;量化参数变小,编码的比特数提高。
七、视频的硬编码和软编码
7.1、定义
软编码: 使用CPU进行编码。
硬编码: 使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。
7.2、优缺点
软编码:
优点:实现简单直接,参数调整方便,易升级。
缺点:CPU负载重,性能较硬编码低,但低码率下质量通常比硬编码要好一点。
硬编码:
优点:性能高
缺点:低码率下通常质量低于软编码,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。
7.3、目前的主流GPU加速平台
Intel、NVIDIA、AMD
7.4、目前主流的GPU平台开发框架
Inel QuickSync: 集成于Intel显卡中的专用视频编解码模块。
CUDA: NVIDIA的封闭编程框架,通过框架可以调用GPU计算资源
AMD APP: AMD为自己的GPU提出的一套通用并行编程框架,标准开放,通过在CPU、GPU同时支持OpenCL框架,进行计算力融合。
OpenCL: 开放计算语言,为异构平台编写程序的该框架,异构平台可包含CPU、GPU以及其他计算处理器,目标是使相同的运算能支持不同平台硬件加速。
八、iOS视频开发
1、视频采集:
https://www.jianshu.com/p/eccdcf43d7d2 2、视频H264硬编码:
https://www.jianshu.com/p/0d18f04e524d 3、视频H264硬解码:
https://www.jianshu.com/p/e6ca899a2192 4、通俗理解YUV数据:
https://www.jianshu.com/p/d9631596e9c7
九、矩证
在第八章中,通俗理解YUV数据涉及到矩证的排列,顺便把矩证的一些基本常识拿起来从新看一遍,还是有不一样的收获的:
1、矩阵: https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5/18069?fr=aladdin
参考:
iOS 音视频编解码基本概念(一)iOS 音视频编解码----H264-I(关键)帧,B/P(参考)帧(二)