走进音视频的世界——音视频编码-程序员宅基地

技术标签: 音视频开发  

音视频流是通过特定编码器压缩,由一系列的压缩图像/语音帧组成。当然可能存在多种语言多音轨,每个音轨之间的音频流相互独立。还可能存在内置字幕,常见的字幕格式有sub、smi、ssa、srt等。但是,本篇文章讨论的主角是音视频编码,常见的视频编码有h264、h265、vp9、mpeg4、mjpeg、wmv3、av1(Alliance for Open Media Video 1,由开放媒体联盟推出,对标h265,旨在成为下一代视频编码技术标准),常见的音频编码有mp3、aac、amr_nb、amr_wb、ac3、vorbis、opus、flac、wmav2等等。音视频格式如下图所示:

 

一、视频编码

为什么要进行视频编码?因为原始YUV数据非常大,而RGB数据更加大,所以需要进行编码。又为什么能够进行视频编码呢?因为视频的图像序列存在时间和空间上的数据冗余,所以能够编码压缩。又怎么样去做视频编码呢?一般步骤是从变换量化、到运动估计运动补偿、最后是编码。

1、变换与量化

变换:把空间域的图像信号变换到频率域。常见的变换有离散余弦变换、傅里叶变换。其中,离散余弦变换又称为DCT变换,在视频压缩中得到广泛应用。

量化:人类对图像的低频特性的信息敏感(比如亮度),对高频特性的信息不敏感(比如色度、对比度),所以才编码过程中可以少用高频信息,全保留低频信息。量化过程是对低频区进行细量化,对高频区进行粗量化,减少人眼不太敏感的图像信息,从而减小数据量、提高压缩率。量化是有损的,量化参数(Quantization Parameter)越大,图像质量越低。

2、运动补偿与运动估计

运动估计:把图像分割成互不重叠的子块,然后以一定大小的窗口,在前一图像或后一图像去移动搜索相似的图像块,这个搜索过程称为运动估计。

运动补偿:通过先前的局部图像来预测、补偿当前的局部图像;

3、熵编码

熵编码是基于变长编码,出现概率大的符号采用短码,出现概率小的符号采用长码,最终的平均码长接近信源熵值。其他的变长编码还包括:哈夫曼编码、游程编码、算术编码等。

4、帧内压缩与帧间压缩

帧内压缩:每帧图像内部存在数据冗余。比如一副图像中有一块颜色相同的画布,编码时按照nxn大小的宏块进行划分,那么宏块之间存在相似性,这就使得可以从空间层面进行压缩,即帧内压缩;

帧间压缩:连续图像之间存在许多相似细节。比如一辆运动中的汽车,从当前时刻到下一时刻发生相对位移,从另外一个角度来说,是周边环境发生相对位移而汽车本身没有变化,这就使得可以从时间层面进行压缩,即帧间压缩;

5、I帧、P帧、B帧

I帧:内部编码帧,又称为关键帧,使用I帧编码可以完整还原一副图像,帧的数据量会比较大;

P帧:前向预测帧,又称为前向参考帧,需要参考前一个I帧进行编码,数据量会比I帧小。同理,解码时也需要参考前一个I帧进行解码;

B帧:双向内插帧,又称为双向参考帧,需要参考前后的I帧或P帧进行编码,压缩率会比P帧更高,数据量比P帧更小。但是,解码时需要下一个I帧或者P帧的到来,解码时序需要严格控制,解码复杂度也相对高。

6、GOP与关键帧间隔

GOP(全称Group Of Pictures),图像序列组,由一个关键帧和若干个非关键帧组成。在编码器参数设置中,有一个参数设置GOP大小。以Android的mediacodec为例,设置关键帧间隔时间Key_Frame_Interval,也就是设置多少秒来一个关键帧。另外有一个类似的参数,关键帧间隔:多少帧来一个关键帧。

7、码率控制

码率控制,是指网络请求码流时,根据网络带宽状况来控制码率大小。分为五种控制方式:恒定码率、动态码率、平均码率、恒定质量因子、恒定量化参数。而Youtube请求网络流时,会根据网络拥挤程度来动态调整码率,得益于一种新的多媒体传输控制协议——DASH,全称为Danymic Adaptive Streaming over HTTP,即基于HTTP的动态自适应媒体流。接下来对码率控制方式进行展开分析。

恒定码率:CBR(Constant Bitrate),以恒定的码率去编码,波动小,编码质量欠佳;

动态码率:VBR(Variable Bitrate),以动态的码率去编码,波动大,编码质量比较稳定;

平均码率:ABR(Average Bitrate),以平均的码率去编码,编码质量参差不齐;

恒定质量因子:CQF(Constant Quality Factor),又称为CRF(Constant Rate Factor),在x264和x265编码默认采用CRF,取值范围为[0,51],数值越大表示视频压缩率越高,编码质量越低;

恒定量化参数:CQP(Constant Quantization Parameter),瞬时码率会随场景复杂度有所波动,在H264定义的QP范围为[0,51],数值越大表示量化步长越大,编码质量越低。当为QP=0时,表示无损编码;

8、SVC分级编码

SVC(全称Scalable Video Coding),可扩展的视频编码,也称为分级编码。具有三大特性:时间可分级、空间可分级、质量可分级。

时间可分级:分为T0、T1、T2、T3,用来设置帧率,丢弃棕、绿、蓝得到不同帧率。如下图所示:

空间可分级:层级越低,分辨率越小,用来设置分辨率。如下图所示:

质量可分级:可以从码流提取不同图像质量的子码流。

       应用领域:视频监控、流媒体直播、视频会议。

       优点:分级码流应用灵活,一次编码多次使用,可得到不同帧率、分辨率、质量;

       缺点:分级码流的解码复杂度增加,比单层码流的压缩率低10%左右;

9、YUV

视频压缩编码后,是以YUV格式进行存储的,Y代表亮度(Chroma),U代表色度(Luma),V代表对比度(Contrast)。常见的YUV排列格式有YUV444、YUV422、YUV420,区别如下表所示:

             YUV444

             每组Y对应一组UV
                      YUV422              每两组Y公用一组UV
                      YUV420              每四组Y公用一组UV

YUV420分为YUV420P和YUV420SP。其中,YUV420P又称为I420,P代表Planar平面,按照Y、U、V顺序排列,存储结构如下图所示:

 而YUV420SP,其中SP代表Semi Planar半独立平面,U和V是交错存储的,存储结构如下图所示:

二、音频编码

人类的听觉范围为20Hz~20KHz,那么低于20Hz或者高于20KHz,这些低频或高频信号基本听不到,可以作为冗余数据,通过特定采样率进行采样、编码。

1、采样率

采样率描述的是每秒对原始声音信号的采样次数,常见的采样率8000Hz、16000Hz、44100Hz、48000Hz,目前使用最广泛的是44100Hz,即44.1KHz。

2、波形编码

直接把时域信号转换为数字编码,不利用任何参数,使得重构后的波形与原始信号的波形形状尽可能保持一致。基本原理是在时间轴对模拟语音信号按照一定速率采样,然后把幅度样本量化,并用代码表示。

3、参数编码

从语音波形信号中提取生成语音的参数,使用这些参数通过语音生成模型重构出语音。音质比较低,但是保密性良好,广泛应用于军事技术中,典型的参数编码为LPC(Linear Predictive Coding)。

4、混合编码

混合编码是指采用两种以上编码技术,比如波形编码与参数编码结合,形成优势互补。

5、PCM

PCM(Pulse Code Modulation 脉冲编码调制),是对连续变化的模型信号抽样、量化、编码的过程,最终转换为数字信号。

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011686167/article/details/108590762

智能推荐

VScode 安装c/c++环境配置_vscode 安装c++-程序员宅基地

文章浏览阅读600次。为了应付暑期实习在线机试,本人进行了为期两天的临时抱佛脚突击复习(佛:救不了,复习两天,瞧不起谁呢。。。),当我看到熟悉的oj页面时我确信,这玩意儿就改该用C语言!染后放弃pycharm和anaconda开始了从零开始的C语言生活。首先我选择了VScode作为编译器(作死的开始),本来anaconda会自带VScode,但是这次下载的不知咋回事没有不要紧!让我们从零开始(作死)。官网下载V..._vscode 安装c++

Matlab:导入文本文件_matlab表格怎么录入汉字-程序员宅基地

文章浏览阅读432次。Matlab:导入文本文件_matlab表格怎么录入汉字

FreeBSD-7 内核malloc 源代码分析_freebsd uma和dlmalloc-程序员宅基地

文章浏览阅读2.8k次。华为数通硬件四部李昂[email protected]://lllaaa.cublog.cn看FreeBSD-7 的内核代码有一段时间了,但是一直没有能够总结一下。由于没有写文档,很多地方都是一带而过,并没有深入分析。为了逼自己能够分析完整个malloc 过程的代码,我决定一边分析一边记录自己的分析笔记。一提到内存分配,自然会想到malloc 和free 这对双胞胎。在FreeBSD 内核里_freebsd uma和dlmalloc

关于Http中Transfer-Encoding: chunked问题_禁用分块传输transfer_encoding-程序员宅基地

文章浏览阅读1.3w次。Http1.1中新增加内容, Transfer-Encoding: chunked 译为:分包传输 进行一次请求时,如果数据量较大,为了加快页面显示,而采取了分包的策略在.net中WebPag 默认不分包MVC4 默认分包一般简单的服务器交互流程比如,需要服务器返回一个字符串(test),不分包时传回内容为test分包情况下传回内容为4_禁用分块传输transfer_encoding

03-类与对象课后作业(1)-程序员宅基地

文章浏览阅读130次。问题:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”代码:使用构造方法:public class ssyy{ public static void main(String[] args){ ssyy sc=new ssyy(); ..._第三章类与对象课后习题

免费rar密码破解工具排行榜_catpasswd-程序员宅基地

文章浏览阅读2.1w次,点赞7次,收藏40次。第三名:Unzip OnlineUnzip Online,只需要从浏览器登陆网页端上传压缩文件即可,其支持Rar、Zip、7z、Tar等格式,上传文件最大支持200MB,网站无需注册,可以实时查看破解进度,地址:https://unzip-online.com/。第二名:Lost My PassLost My Pass此网站基本功能都有,其支持从浏览器登陆网页直接上传需破解压缩文件,除了常见了压缩文件破解密码之外,其还支持PDF、Office等加密文件的破解,地址:https://www.l._catpasswd

随便推点

Visual Studio Code快捷键_Linux-程序员宅基地

文章浏览阅读351次。Keyboard shortcuts for LinuxBasic editingCtrl + X            Cut line(empty selection)Ctrk + C            Copy line(empty selection)Alt + ↓ / ↑           Move line down/up     将当前行向下或..._linux系统的visual studio快捷键

matlab实现加减乘除、乘方、开平方、带括号和结果分析的GUI计算器_matlab gui计算器平方-程序员宅基地

文章浏览阅读1.5k次。matlab实现加减乘除、乘方、开平方、带括号和结果分析的GUI计算器 ,界面如下:有源码,打赏私聊,微信和电话:15653242819。_matlab gui计算器平方

Parcelable与Serializable_parcelable会写入磁盘吗-程序员宅基地

文章浏览阅读334次。由于 Java 的 Serializable 的性能较低,Parcelable 正式在这个背景下产生的,它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。Serializable使用大量反射和临时变量,而Parcelable少许反射通过启动 Activity 过程分析 Parcelable 序列化过程:熟悉这一过程的朋友过程肯定知道,startActivity 方法最终会通过 AMS(ActivityManagerService)完成跨进程通信调用,但是在通信之前先要将数据序列化后进_parcelable会写入磁盘吗

关于docker容器创建的centos8系统镜像中文乱码的问题-程序员宅基地

文章浏览阅读929次。  以centos系统为基础,创建的docker容器会乱码,系统为centos8,解决方案查询当前系统的语言包,如果没有 “zh” 开头的中文包,则需要下载locale -a在yum源中查找能安装的中文包yum search Chinese安装中文包yum install langpacks-zh_CN.noarch安装完成后,更改系统的配置localectl set-locale LANG=zh_CN.utf8...

鸿蒙系统预计什么时候上市,鸿蒙系统什么时候上市?鸿蒙系统什么时候用于手机(图文)...-程序员宅基地

文章浏览阅读147次。相信大家都听说了华为的鸿蒙系统目前已经被实锤了,但是鸿蒙系统究竟什么时候能够用在华为手机上,还是个未知数。不过大家非常好奇鸿蒙系统什么时候能用?鸿蒙系统什么时候能在手机上用?今天小编就带大家一起了解一下。鸿蒙系统什么时候能用前一段时间,华为官方正式对外表态:“华为将会在2020年,华为所有的智能终端设备都将会全面启用华为鸿蒙OS系统,但却将“平板、手机以及电脑这三大类的产品排除在外,这意味着华为鸿..._鸿蒙电脑操作系统什么时候上市

HashMap底层实现原理及面试问题_hashmap底层原理面试题-程序员宅基地

文章浏览阅读10w+次,点赞293次,收藏2k次。①HashMap的工作原理HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存..._hashmap底层原理面试题