一、音视频基础知识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一、音视频基础知识相关的知识,希望对你有一定的参考价值。
参考技术A 视频编码指的就是通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式的文件的方式。视频流传输中最重要的编解码标准有国际电联的H.261、H.263、H.264和国际标准化组织运动图像专家组的MPEG系列标准。
MPEG系列:(由ISO[国际标准化组织]下属的MPEG[运动图像开发专家组]开发) 视频编码方面主要是MPEG1(VCD)、MPEG2(DVD)、 MPEG4、MPEG4 AVC(正热门)。音频编码方面主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(MP3) 、 MPEG-2AAC、 MPEG-4 AAC等。
H.26X系列: (由 ITU[国际电传视讯联盟]主导,侧重网络传输,只有视频编码) H.261、H.262、H.263、H.263+、H.263++、H.264(与MPEG4 AVC 合作的结晶)
常见的音频编码格式有AAC、MP3、AC3
MP3:是一种音频压缩技术,它被设计用来大幅度地降低音频数据量。将音乐以1:10 甚至1:12的压缩率,压缩成容量较小的文件,而对于大多数的用户来说,重放的音质于最初不压缩的音频相比没有明显下降。 MP3的特点是,利用人耳对高频信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同的频段使用不同的压缩率,对高频信号使用大压缩率(甚至忽略信号),对低频信号使用小压缩率,保证信号不失真。这样一来就相当于抛弃人耳基本听不到的高频声音,只保留能听到的低频部分,从而将声音用1:10甚至1:12的压缩率压缩。
AAC:一种专门为声音数据设计的文件压缩格式,与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的”性价比“,在感觉声音在没有明显降低的前提下,可使文件更加小巧。AAC的优点是,相对于MP3,AAC的音质更加文件更小。AAC缺点是,AAC是属于有损压缩格式,与时下流行的APE、FLAC等无损压缩格式相比音质存在本质上的差距。
AC3:有损音频编码格式。被广泛应用与5.1声道。AC3普及程度很高,唱片、电影院。AC3提供的环绕声系统由5个全频域声道和1个超低音声道组成。
MediaPlayer: 播放控制
MediaCodec: 音视频编解码
OMX: 多媒体部分采用的编解码标准
StageFright:它是一个框架,替代之前的OpenCore,主要是做了一个OMX层,仅仅对OpenCore的omx-component部分做了引用。StageFright是在MediaPlayerService这一层加入的,和OpenCore是并列的。StageFright在android 中是以共享库的形式存在的(libstegefright.so),其中model----NuPlayer/AwesomePlayer可以用来播放音视频。
AudioTrack : 音频播放。
VLC : Video LAN Client,是一款自由、开源的跨平台多媒体播放器及框架。
FFmpeg : 多媒体解决方案,不是多媒体框架,广泛用于音视频开发中。
GStreamer : 一套构建流媒体应用的开源多媒体框架。
是用于测量显示帧数的量度。所谓的测量单位为每秒显示的帧数。每秒显示帧数或者帧率表示图形处理器处理场时每秒能够更新的次数。30fps就是可以接受的,60fps则可以明显提升交互感和逼真感,但超过75fps就不容易察觉有明显的流畅度提升了。如果帧率超过屏幕刷新率,则会浪费图像的处理能力。
刷新率是指屏幕每秒画面被刷新的次数,刷新率分为垂直刷新率和水平刷新率,一般提到的刷新率通常是指垂直刷新率。垂直刷新率表示屏幕上图像每秒重绘多少次,也就是每秒屏幕刷新的次数,以Hz为单位。刷新率越高,图像就越稳定,图像显示就越自然清晰,对眼睛的影响也越小。达到80Hz以上的刷新率就可以完全消除图像闪烁和抖动感。
编码的目的是压缩数据量,采用编码算法压缩冗余数据。(MPEG、H.26X)
把编码后的音视频数据以一定格式封装到一个容器中,封装格式有mkv、avi、ts等。
码率也就是比特率,比特率是单位时间播放连续的媒体(如压缩后的音频或视频)的比特数量。比特率越高,带宽消耗得越多。比特(bit)0或1
文件大小(b) = 码率(b/s) * 时长(s)
视频质量和码率、编码算法都有关系。
DTS: 即 Decode Time Stamp,主要是用于标示读入内存中比特率在什么时候开始送入解码器中进行解码
PTS: 即Presentation Time Stamp,主要用于度量解码后的视频帧什么时候被显示出来
常见的视频帧有I、P、B帧等
I 帧表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)
P 帧表示的是这一帧和之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
B 帧是双向差别帧,也就是B帧记录的是本帧和前后帧的差别,通过前后画面数据与本帧数据的叠加取得最终的画面。B帧压缩率高,但解码时CPU比较吃力。
音频帧的概念没有那么清晰,跟音频编码格式相关,它是各个编码标准自己实现的。
PCM(未经编码的音频数据)来说,它根本就不需要帧的概念,根据采样率和采样精度就可以播放,比如采样率为44.1kHz,采样进度为16位的音频,你可以算出比特率是4410016kb/s,每秒的音频数据是固定的4410016/8字节。
AMR 帧比较简单,它规定每20ms的音频为一帧,每一帧音频都是独立的,有可能采用不同的编码算法以及不同的编码参数。
MP3帧较复杂,包含更多信息,比如采样率、比特率等各种参数。音频数据帧个数由文件大小和帧长决定,每一帧的长度可能不固定,也可能固定,由比特率决定,每一帧又分为帧头和数据实体两部分,帧头记录了MP3的比特率、采样率、版本等信息,每一帧之间相互独立。
表示可以将模拟信号分成多少个等级,量化精度越高,音乐的声压振幅越接近原音乐。量化精度的单位是bit(比特) 。也可以理解为一个采样点用多少比特表示(8/16/24/32bit)。CD-->16bit , DVD-->24bit。
每秒音频采样点个数(8000/44100Hz),采样单位用Hz表示。
声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或者回放时相应的扬声器数量。单声道、立体声道、4声道、5.1声道、7.1声道等。
音视频开发入门基础知识(视频入门篇)
RTSP实时音视频开发实战课程:<RTSP实时音视频开发实战>
音视频开发入门基础知识(音频入门篇)
目录
一、前言
当前随着科技的进步和人们生活水平的不断提高,现在人们在茶余饭后都会使用手机、电脑等这类产品,来看一些有趣的视频,来娱乐自己;而这些都离不开音视频技术的支持。本文开始介绍视频开发中最基本的技术知识,比如视频采集和显示、视频常见的格式、视频压缩编码等。
首先要知道我们是如何通过视频来看到他人的;如下图所示,视频/声音通过摄像头/麦克风采集后(捕捉)将视频/声音通过网络发送出去,其他人通过网络接收后将视频显示到屏幕上,声音在扬声器播放,比如我们通过抖音、朋友圈视频等,都是拍摄视频上传,通过网络传输,之后在通过网络接收来播放视频和声音;另外视频/声音通过摄像头/麦克风采集后(捕捉)将视频/声音保存为文件存储后,通过播放器选择文件来播放,将视频画面显示到屏幕上,声音通过扬声器播放,比如我们手机通过相机拍摄后就是保存在手机中,然后通过手机自带播放器来播放视频和声音。
二、视频采集和显示
人们要想看到自然界中的景象就需要光,通过光的传递将自然界的景象传递给人眼。我们手机/相机对景象的采集也是通过光。如下图是视频/图像采集的一个过程;通常自然界的人物和景象通过光电转换将光信号转换为电信号,常见的光电转换就是摄像头感光元器件;电信号经过处理器转为数字信号,程序就可以将数字信号进行处理存储为文件。
那么显示器是如何显示数字图像的呢?如下图是显示数字图像的过程;处理器将数字信号转为电信号,电信号通过电光转换器后转换为光信号,就可以被人眼观察到;通常电信号转为光信号的有发光二极管、液晶显示器等。
上面介绍了图像的显示过程,那么视频和图像什么关系呢?我们都知道一张图像里面的画面是静止,而视频里面的画面是可以动态的,所以视频和图像最大差异在于视频是动态而图像是静态的。其实视频是由若干张图像组成(注意这里的若干个图像是存在差异的,即不同时刻拍摄的运动物体/景象);当物体在运动过程中通过快速的连续不断的拍摄若干张图像组合在一起就构成了一个视频,这就是视频拍摄的过程。如下图绿荫场上的小球从高抛的过程,通过相机连续不断的拍摄出多个静态图像经过组合就可以得到一个小球高抛的运动状态的视频出来。
三、视频常见的格式
任何一个视频或者一个图像都有一个像素格式,而像素是指在数字图像/视频中一个最小的颜色单位,在图像/视频中按照水平+垂直的方向进行排列,通过像素的位置和颜色就可以呈现真实景象的样子。如下图是一副图像,下图的一个格子就可以认为是一个像素(实际进行了放大)。水平和垂直方向的数字520和280就是这个图像的大小,也叫图像的宽度和高度,通常也叫分辨率520x280,也就是图像的宽度是520,高度是280,单位就是像素。
经过摄像头/处理器得到的视频/图像的像素格式通常有RGB、YUV等格式,在这里我们重点介绍RGB和YUV。
什么是RGB?RGB格式也叫RGB色彩,就是常说的光学三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色);自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成。在RGB格式的图像中一个像素包含了R、G、B三个颜色,其中每个颜色占8bit,也就是一个字节,三个颜色就是24bit(3个字节),由于一个R、G或者B占用8bit那么其所表达的数字范围就是0-255,所以单个颜色所能表示的颜色范围只有256中。通常为了方便图像的存取,RGB格式的图像其三个颜色是交叉存储的,如下图,一个像素的RGB值存储完之后存下一个像素的RGB值。一副分辨率为520x280的RGB格式的图像其大小为520x280*3=436800字节=426.5625KB。
此外对于RGB图像格式不同可能每个像素大小不同,除了RGB格式还有其他格式比如RGBA格式,ARGB格式、BGR格式等、对于RGBA格式和ARGB格式是在RGB颜色上多了一个Alpha,也通常指图像的透明度,也占用一个字节;对于ARGB和RGBA格式的图像来说每一个像素占32bit(4个字节),一副分辨率为520x280的ARGB/RGBA格式的图像其大小为520x280*4=582400字节=568.75KB。BGR图像格式和RGB的格式像素大小都是24bit仅仅是RGB的存储顺序不同,RGB是先存储Red颜色,BGR是先存储Blue颜色。另外还有些更高bit的RGB格式存在,比如10bit的RGB甚至16bit的RGB,10bit和16bit的RGB和8bit的RGB相比大小会明显增大,此外10bit和16bit由于单个像素的bit数增加那么所表达的颜色范围也会增加,比如10bitRGB单个颜色值的范围为0-1023,所以10bitRGB可以表示的颜色有1024种,比8bitRGB高出4倍。
什么是YUV?YUV是是一种颜色编码方法,通常是对RGB进行颜色转换得到YUV。Y通常是颜色中的亮度信息(灰度信息),UV是颜色中的彩色信息。通常人眼对事物颜色的亮度和彩色信息的敏感程度不同,大多是对亮度敏感度较高,对彩色信息敏感度较低,所以将颜色的亮度和彩色信息分离表示可以有助于图像的编码。通常YUV的格式有YUV444、YUV422、YUV420;YUV444表示的YUV图像中亮度和彩色信息所占空间大小是1:1:1(Y:U:V);YUV422表示的YUV图像中亮度和彩色信息所占空间大小是2:1:1(Y:U:V),即彩色信息量和亮度信息量相比较降低了一半的信息和存储空间;YUV420表示的YUV图像中亮度和彩色信息所占空间大小是4:1:1(Y:U:V),即彩色信息量和亮度信息量相比较降低了3/4的信息和存储空间,YUV格式通常是减少彩色信息量来降低存储空间大小的一种格式;YUV420的存储空间结构举例可以如下图所示,先存储32个Y,在存帧8个U和8个V。
在实际的视频和图像编码中使用的YUV格式大多是YUV420的。可以发现上图YUV420的存储结构的三个分量(Y/U/V)是单独存储的,除了上面的单独存储格式外还有UV交织存储的YUV420格式,比如NV21,NV12,这两种也是比较常见的YUV420格式。NV21通常是V在前U在后的存储方式,NV12是U在前V在后的存储方式.,如下图左侧是NV12,右侧是NV21.
YUV图像格式通常一个像素由Y分量和U、V分量表示,三个分量通常都是占8bit(一个字节),对于YUV420(NV21/NV12)的图像来说一个像素需要1.5个字节(一个字节的Y和0.25字节的U+0.25字节的V)表示;一副520x280的YUV420图像大小为520x280x1.5=218400字节=213.28KB,可以看到YUV420的格式图像比同分辨率的RGB的大小降低了一半。和RGB一样,YUV不仅有8bit的数据也有10bit、12bit表示的,对于Y(亮度)10bit的数据可以表示0-1023范围的亮度,UV10bit的数据可以表示0-1023范围的色度。
四、RGB转YUV和YUV转RGB
通常情况下RGB格式的图像其大小比较大,占用较大的存储空间,所示需要对RGB格式进行压缩,通常RGB压缩为YUV(通常是YUV420),RGB压缩为YUV的过程也就是RGB转YUV的公式如下,下面的公式是BT709色域空间下的RGB转YUV的公式。
BT709
Y = 0.183*R + 0.614*G + 0.062*B + 16;
U = 0.439*B - 0.339*G - 0.101*R + 128;
V = 0.439*R - 0.399*G - 0.040*B + 128;
下面的公式是BT601色域空间下的RGB转YUV的公式。
BT601
Y = 0.257*R + 0.504*G + 0.098*B + 16;
U = 0.439*B - 0.291*G - 0.148*R + 128;
V = 0.439*R - 0.368*G - 0.071*B + 128;
关于BT709和BT601是国际标准中不同的两种色域(也就是表示红绿蓝颜色的范围)。
另外在显示图像数据的时候通常都是按照RGB数据格式进行显示像素点,所以实际显示YUV数据的时候还需要将YUV转RGB,下面的公式是BT709色域空间下的YUV转RGB的公式。
BT709
R = 1.164*(Y-16) + 1.792*(V-128);
G = 1.164*(Y-16) - 0.213*(U-128) - 0.534*(V-128);
B = 1.164*(Y-16) + 2.114*(U-128);
下面的公式是BT601色域空间下的YUV转RGB的公式。
BT601
R = 1.164*(Y-16) + 1.596*(V-128);
G = 1.164*(Y-16) - 0.392*(U-128) - 0.812*(V-128);
B = 1.164*(Y-16) + 2.016*(U-128);
五、视频的压缩编码
上面的RGB和YUV的介绍中我们可以知道,一副格式为YUV420,分辨率为520x280的图像占用213.28KB,如果是格式为YUV420,分辨率为520x280,时常为1秒,帧率为30帧每秒的视频其大小为520x280x1.5x30=6398.4375KB=6.25MB,如果视频分辨率是高清也就是1920x1080,则视频的大小为1920x1080x1.5x30=91125KB=88.99MB,如果你要从网上看格式为YUV420,分辨率1920x1080,帧率30帧每秒的视频则需要的网速是88.99MB*8=711.9Mb每秒,这种网速一般人根本达不到。如果你要是录制格式为YUV420,分辨率1920x1080,帧率30帧每秒,时常为1小时的视频则大小是:1920x1080x1.5*30*60*60=320364MB=312.8GB,这么大的存储空间,一部256G内存的手机根本不够用,所以需要对YUV格式的视频进一步压缩才能满足我们日常视频拍摄,浏览的需求。
目前视频压缩编码算法标准比较多,通常使用较多的是H264(也叫AVC)和H265(也叫HEVC);使用H264对YUV420的图像进行压缩,压缩率可以达到100倍-200倍,而且不影响视频的观看,H265编码算法可以达到300倍的压缩率,而且不影响视频的观看。下图是H264的编码框图。
下图是H265的编码框图。
根据H264和H265的编码框图看出H265编码算法更加复杂。实际上H265的压缩效率比H264的要高,但是同时H265的编码器实现更加困难,目前开源的H265编码器X265比H264开源的X264编码器速度要慢上很多。
下图是视频采集到编码的数据流程图。
下图是视频解码到显示的数据流程。
H264和H265编码器对YUV进行压缩,主要过程是对视频YUV进行编码,将YUV数据编码为IDR帧、P帧、B帧;
IDR帧(Instantaneous Decoding Refresh),即时解码刷新,是视频的关键帧,IDR帧的解码不需要依赖其他视频帧。解码器遇到这个帧会将之前的解码信息清空,根据当前的IDR帧解码生成新的解码信息。视频编码帧中可以有多个IDR帧。
P帧 是前向预测编码的视频帧,它的解码只能参考它前面的P帧或者IDR帧。
B帧 是双向预测编码的视频帧,它的解码需要参考前面的P帧或者IDR帧,也需要参考它后面的P帧或者IDR帧。
通常IDR帧采用帧内压缩方式,只消除空域上的内容冗余,压缩率比较低;P帧采用帧内和帧间的压缩方式不仅消除空间上的冗余也可以消除时间上的冗余,压缩效率比较高;B帧也采用帧间帧内和帧间的压缩方式,也会消除空间和时间上的冗余,其采用双向预测编码可以进一步降低时间冗余。因此视频压缩的目的是降低视频内容的冗余,使用更少的数据量来保存图像信息。
下图是H264/H265视频编码帧结构图。
有关H264和H265视频码流的分析如下文章:
以上是关于一、音视频基础知识的主要内容,如果未能解决你的问题,请参考以下文章