音视频基本概念

名词解释

媒体:是表示,传输,存储信息的载体,常人们见到的文字、声音、图像、图形等都是表示信息的媒体。

多媒体: 是声音、动画、文字、图像和录像等各种媒体的组合,以图文并茂,生动活泼的动态形式表现出来,给人以很强的视觉冲击力,留下深刻印象

多媒体技术:是将文字、声音、图形、静态图像、动态图像与计算集成在一起的技术。它要解决的问题是计算机进一步帮助人类按最自然的和最习惯的方式接受和处理信息。

流媒体 :流媒体是指采用流式传输的方式在Internet播放的连续时基媒体格式,实际指的是一种新的媒体传送方式,而不是一种新的媒体格式(在网络上传输音/视频等多媒体信息现在主要有下载和流式传输两种方式)。流式传输分两种方法:实时流式传输方式(Realtime streaming)和顺序流式传输方式(progressive streaming)。

多媒体文件是既包括视频又包括音频,甚至还带有脚本的一个集合,也可以叫容器

媒体编码是文件当中的视频和音频所采用的压缩算法。也就是说一个avi的文件,当中的视频编码有可能是A,也可能是B,而其音频编码有可能是1,也有可能是2。

转码指将一段多媒体包括音频、视频或者其他的内容从一种编码格式转换成为另外一种编码格式

视频连续的图象变化每秒超过24帧(Frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面,看上去是平滑连续的视觉效果,这样连续的画面叫做视频

音频人类能听到的声音都成为音频,但是一般我们所说到的音频时存储在计算机里的声音

码率码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps(即,千位每秒)。 通俗一点的理解就是采样率,单位时间内采样率越大精度就越高,处理出来的文件就越接近原始文件,但是文件体积与采样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真。但是因为编码算法不一样,所以也不能用码率来统一衡量音质或者画质。

帧就是一段数据的组合,它是数据传输的基本单位。就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。 一帧就是一副静止的画面,连续的帧就形成动画,如电视图像等。

帧率帧率即每秒显示帧数,帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过新率的帧率就浪费掉了。

关键帧相当于二维动画中的原画,指角色或者物体运动或变化中的关键动作所处的那一帧,它包含了图像的所有信息,后来帧仅包含了改变了的信息。如果你没有足够的关键帧,你的影片品质可能比较差,因为所有的帧从别的帧处产生。对于一般的用途,一个比较好的原则是每5秒设一个关键键。但如果时那种实时传输的流文件,那么要考虑传输网络的可靠度,所以要1到2秒增加一个关键帧。

视频播放器原理

视音频技术主要包含以下几点:封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。

解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

音频采样

数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。

将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样频率或采率,单位为HZ(赫兹),例如 44100Hz。

采样频率越高所能描述的声波频率就越高。

采样率决定声音频率的范围(相当于音调),可以用数字波形表示。

以波形表示的频率范围通常被称为带宽。要正确理解音频采样可以分为采样的位数和采样的频率。

YUV

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV格式

  • planar格式:首先连续存储所有的Y像素点,然后存储U像素点,最后存储V像素点。

  • packed格式:每个像素点的YUV分量是连续交叉存储的。

分量

  • Y分量:表示明亮度即灰度值,如果我们要在一帧YUV格式的图片里得到灰度图像只需要把所有的Y分量分离出来就可以了,下面我们会讲到。
  • UV分量:表示色彩和饱和度,用于指定像素的颜色

YUV采样方式

  • YUV4:4:4采样:每一个Y对应一组UV分量
  • YUV4:2:2采样:每两个Y对应一组UV分量
  • YUV4:2:0采样:每四个Y对应一组UV分量

Y是屏幕的亮度,那么他的数据大小就是视频的宽*高,代表屏幕上所有的点

对于420P来说,一个Y对应1/4个U和1/4个V,所以就是宽高\1/4

YUV420P:

​ 如果视频帧的宽和高分别为w和h,那么一帧YUV420P像素数据一共占用wh3/2 Byte的数据。其中前wh Byte存储Y,接着的wh1/4 Byte存储U,最后wh*1/4 Byte存储V

YUV444P:如果视频帧的宽和高分别为w和h,那么一帧YUV444P像素数据一共占用wh3 Byte的数据。其中前wh Byte存储Y,接着的wh Byte存储U,最后w*h Byte存储V (1对1 所以Y是宽x高 UV也是宽x高 总数就是宽x高x3 )

通常我们所用的YUV格式是 ITU-R 的标准 , 也叫YCbCr.

YUV是由RGB格式的数据转换得来:

1
2
3
4
5
6
7
Y     Y = 0.299 x R + 0.587 x G + 0.114 x B + 0 
U Cb = -0.169 x R - 0.331 x G + 0.499 x B + 128
V Cr = 0.499 x R - 0.418 x G - 0.0813 x B + 128

Y Y = 0.299 x R + 0.587 x G + 0.114 x B + 0
U Cb = -0.169 x R - 0.331 x G + 0.499 x B + 128
V Cr = 0.499 x R - 0.418 x G - 0.0813 x B + 128

一开始的图片存储方式是这样的(一个像素点):

yuv

YUV4:4:4

其实就是YUV的数据各占用8位, 每个像素都由YUV组成

1
2
3
同一行的相邻4个像素数据:   Y0U0V0    Y1U1V1   Y2U2V2  Y3U3V3
存储时: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 //即每个像素YUV的数据都会存放起来
为什么叫4:4:4 , 意思就是4个像素里的数据有4个Y, 4个U, 4个V

图中一格代表一个像素点

YUV4:2:2

其实绝大部分相邻的两个像素,数据差异应不大。所以为了节点空间便于存储,丢失每个像素的部分数据。
专家研究表明我们人对亮度比较敏感,而对色彩不怎么敏感。所以每个像素的亮度Y数据是绝对不动的,而色差数据可以进行丢弃

1
2
3
4
5
6
同一行的相邻4个像素数据:   Y0U0V0    Y1U1V1   Y2U2V2  Y3U3V3
存储时: Y0 U0 Y1 V1 Y2 U2 Y3 V3 // 每两个相邻的像素, 一个丢弃V数据,一个丢弃U数据
为什么叫4:2:2, 意思就是相邻的4个像素里有4个Y, 2个U, 2个V。 按上面存储的顺序也叫YUYV.

但还原成RGB数据必须需要YUV, 像第一个像素只有Y0U0是没法还原的,这时只能用下一像素的V1数据。
还原时的YUV: [Y0U0V1] [Y1U0V1] [Y2U2V3] [Y3U2V3] //这样还原理论上会对图像的质量有影响的,但我们看不出来的.

YUV4:2:0

专家们进一步研究表示,每一行的相邻两个像素与下一行同位置的两个像素数据差异不大,可以进一步的丢数据。

1
2
3
4
5
6
7
8
9
10
如两行的像素数据:
Y00U00V00 Y01U01V01 Y02U02V02 Y03U03V03 ....
Y88U88V88 Y89U89V89 Y90U90V90 Y91U91V91 ....

存储时: Y00U00 Y01 Y02U02 Y03 //每个像素的Y数据保留, 两个像素数据只保留一个U数据。这一行不保留V数据(YUV: 420)
Y88V88 Y89 Y90V90 Y91 // .... 两个像素数据只保留一个V数据, 这行不保留U数据(YUV: 402)

还原时只能相同位置的上下两行4个像素结合还原:
Y00U00V88 Y01U00V88 Y02U02V90 Y03U02V90
Y88U00V88 Y89U00V88 Y90U02V90 Y91U02V90

yuv数据还分成打包的,平面的。
打包的意思是: yuv数据是顺序存放Y,接着U,再接着V数据存放。
平面的意思是: yuv数据是分成三个地方存放, 一个地方只存Y数据, 一个只存U数据, 一个只存V数据

RGB

计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red)、G(Green)、B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为RGB色彩空间表示(它也是多媒体计算机技术中用得最 多的一种色彩空间表示方法)。根据色度学的介绍,不同波长的单色光会引起不同的彩色感觉,但相同的彩色感觉却可以来源于不同的光谱成分组合。自然界中几乎所有的颜色都能用三种基本彩色混合配出,在彩色电视技术中选择红色、绿色、和蓝色作为三基色。其他的颜色都可以用红色、绿色和蓝色按照不同的比例混合而成。所选取的红色、绿色和蓝色三基色空间。简称为RGB颜色空间。

  • RGB565:每个像素用16位表示,RGB分量分别使用5位、6位、5位
  • RGB555:每个像素用16位表示,RGB分量都使用5位(剩下1位不用)
  • RGB24: 每个像素用24位表示,RGB分量各使用8位
  • RGB32: 每个像素用32位表示,RGB分量各使用8位(剩下8位不用)
  • ARGB32:每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)

PCM

什么是PCM?

PCM(Pulse Code Modulation—-脉码调制录音) ,所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。

简单一句,PCM就是没有压缩的音频格式

pcm 音频数据的存储方式?

采样1和2表示一个采样点

8Bit
  1. 8 Bit 单声道:
采样1 采样2
数据1 数据2
  1. 8 Bit 双声道
采样1 采样2
声道1数据1 声道2数据1 声道1数据2 声道2数据2
16Bit
  1. 16 Bit 单声道:
采样1 采样2
数据1低字节 数据1高字节 数据1低字节 数据1高字节
  1. 16 Bit 双声道
采样1
声道1数据1低字节 声道1数据1高字节 声道2数据1低字节 声道2数据1高字节
采样2
声道1数据2低字节 声道1数据2高字节 声道2数据2低字节 声道2数据2高字节
PCM16LE双声道数据

“16”代表采样位数是16bit。由于1Byte=8bit,所以一个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中

ffmpeg下的PCM数据操作
1
2
3
4
5
6
7
8
9
10
11
12
short *sample_buffer_L = pFrame->extended_data[0];//存放着左声道的数据
short *sample_buffer_R = pFrame->extended_data[1];//存放着右声道的数据

//两者都是16bit,而裸的PCM文件里的数据是按照 LRLRLRLR 这样存储的,
//所以我们需要按照这种格式存储16bit的数据:

//Left channel
data[i] = (char)(sample_buffer_L[j] & 0xff);//左声道低8位
data[i+1] = (char)((sample_buffer_L[j]>>8) & 0xff);;//左声道高8位
//Right channel
data[i+2] = (char)(sample_buffer_R[j] & 0xff);//右声道低8位
data[i+3] = (char)((sample_buffer_R[j]>>8) & 0xff);;//右声道高8位

具体操作可查看雷神的PCM文章

视音频数据处理入门:PCM音频采样数据处理

H.264码流协议

H.264是一种对视频数据编解码的一种协议,大家都知道若让视频原始数据包在网络中传输对网络的开销就太大了,想想若是播放超清视频,每帧视频大概就有3MB左右,要让人眼看到流畅的画面,就需要每秒10帧以上,也就是每秒传输就有30MB左右大小。这无疑对网络照成的压力过大。而H.264的最大优势就是具有很高的数据压缩比率,在保证图像的清晰度下,H.264的压缩比是MPEG2的2倍以上,是MPEG4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的10∶1。低码率(LowBitRate)对H.264的高的压缩比起到了重要的作用,和MPEG2和MPEG4ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济

基本原理

H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示。

img

其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。

H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。

参考文章:

H.264码流协议解析

视音频数据处理入门:H.264视频码流解析

yuv数据格式介绍与rgb的转换,图像文件的封装

视频概念