音视频开发进阶指南
Posted wddx5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频开发进阶指南相关的知识,希望对你有一定的参考价值。
1.
WAV编码:PCM(脉冲编码调制)是Pulse Code Modulation的缩写。前面已经介绍过PCM大致的工作流程,而WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。WAV格式的文件称为无压缩的格式,对于WAV格式音频文件,ffplay肯定可以直接播放,但是若让ffplay播放PCM裸数据的话,只要为其提供上述三个主要的信息,那么它就可以正确地播放了。
音频的原始数据格式PCM,视频的原始数据格式(YUV420P或者rgba)。
播放YUV420P格式的视频帧:
ffplay -f rawvideo -pixel_format yuv420p -s 480*480 texture.yuv
播放rgb的原始数据:
ffplay -f rawvideo -pixel_format rgb24 -s 480*480 texture.rgb
2.
后来人们通过实验证明,红绿蓝三种色光无法被分解,故称为三原色光,等量的三原色光相加会变为白光,即白光中含有等量的红光(R)、绿光(G)、蓝光(B)。
3.
与RGB视频信号传输相比,YUV最大的优点在于只需要占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也称灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面——色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,而Cb反映的则是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
4.
彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号,最常用的表示形式是Y、U、V都使用8个字节来表示,所以取值范围就是0~255。在广播电视系统中不传输很低和很高的数值,实际上是为了防止信号变动造成过载,因而把这“两边”的数值作为“保护带”,不论是Rec.601还是BT.709的广播电视标准中,Y的取值范围都是16~235,UV的取值范围都是16~240。
5.视频编码标准
还记得前面提到过的图像编码标准JPEG吗?对于视频,ISO同样也制定了标准:Motion JPEG即MPEG,MPEG算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样可以大大提高视频的压缩比。截至目前,MPEG的版本一直在不断更新中,主要包括这样几个版本:Mpeg1(用于VCD)、Mpeg2(用于DVD)、Mpeg4 AVC(现在流媒体使用最多的就是它了)。
相比较于ISO制定的MPEG的视频压缩标准,ITU-T制定的H.264视频编码标准创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和新一代的环路滤波器,这使得压缩性能得到大大提高。
6.编码概念
1.IPB帧
视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩
时,会采取各种算法以减少数据的容量,其中IPB帧就是最常见的一
种。
·I帧:帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所
使用的一种视频压缩技术)的第一个帧,经过适度地压缩,作为随机访
问的参考点,可以当成静态图像。I帧可以看作一个图像经过压缩后的
产物,I帧压缩可以得到6:1的压缩比而不会产生任何可觉察的模糊现
象。I帧压缩可去掉视频的空间冗余信息,下面即将介绍的P帧和B帧是
为了去掉时间冗余信息。
·P帧:前向预测编码帧(predictive-frame),通过将图像序列中前
面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也
称为预测帧。
·B帧:双向预测内插编码帧(bi-directional interpolated prediction
frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面
的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称
为双向预测帧。
基于上面的定义,我们可以从解码的角度来理解IPB帧。
·I帧自身可以通过视频解压算法解压成一张单独的完整视频画面,
所以I帧去掉的是视频帧在空间维度上的冗余信息。
·P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画
面。
·B帧则需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一
张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗
余信息。
IDR帧与I帧的理解
在H264的概念中有一个帧称为IDR帧,那么IDR帧与I帧的区别是什
么呢?首先来看一下IDR的英文全称instantaneous decoding refresh
picture,因为H264采用了多帧预测,所以I帧之后的P帧有可能会参考I
帧之前的帧,这就使得在随机访问的时候不能以找到I帧作为参考条
件,因为即使找到I帧,I帧之后的帧还是有可能解析不出来,而IDR帧
就是一种特殊的I帧,即这一帧之后的所有参考帧只会参考到这个IDR
帧,而不会再参考前面的帧。在解码器中,一旦收到一个IDR帧,就会
立即清理参考帧缓冲区,并将IDR帧作为被参考的帧。
2.PTS(解码时间戳)与DTS(显示时间戳)
DTS主要用于视频的解码,英文全称是Decoding Time Stamp,PTS
主要用于在解码阶段进行视频的同步和输出,全称是Presentation Time
Stamp。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B
帧打乱了解码和显示的顺序,所以一旦存在B帧,PTS与DTS势必就会
不同,本书后边的章节里会详细讲解如何结合硬件编码器来重新设置
PTS和DTS的值,以便将硬件编码器和FFmpeg结合起来使用。这里先简
单介绍一下FFmpeg中使用的PTS和DTS的概念,FFmpeg中使用
AVPacket结构体来描述解码前或编码后的压缩数据,用AVFrame结构体
来描述解码后或编码前的原始数据。对于视频来说,AVFrame就是视频
的一帧图像,这帧图像什么时候显示给用户,取决于它的PTS。DTS是
AVPacket里的一个成员,表示该压缩包应该在什么时候被解码,如果视
频里各帧的编码是按输入顺序(显示顺序)依次进行的,那么解码和显
示时间应该是一致的,但是事实上,在大多数编解码标准(如H.264或
HEVC)中,编码顺序和输入顺序并不一致,于是才会需要PTS和DTS
这两种不同的时间戳。
以上是关于音视频开发进阶指南的主要内容,如果未能解决你的问题,请参考以下文章
最新Android音视频开发进阶指南,阿里大佬整理,限时分享!