音视频基础


一、音视频录制原理

音视频录制流程

如图,视频数据由摄像头负责采集,采集的数据用RGB、YUV去表示。图像处理单元可以进行亮度等的处理,之后将图像放到图像帧队列,编码线程从队列取数据进行编码,编码是为了压缩数据,编码后的数据按一定格式写到文件。

音频数据由麦克风采集,数据用PCM来表示,之后也是对数据进行处理、编码再写到文件。

在采集音视频的时候,时钟给音视频加上时间戳,用于控制音视频同步。

二、音视频播放原理

音视频播放原理

音视频的播放流程,是录制的逆向过程。解码后的数据放到队列是为了同步控制。

三、视频基础

1、图像基础概念

  • 像素,是一个图片的基本单位,有图像元素之意。图片的英文单词缩写是pix,元素的英文单词是element,二者得到"pixel",所以像素简称px。例如3840×2160的照片就是指横向有3840个像素点,竖向有2160个像素点,总共约820万个像素(3840×2160分辨率是4K,4K指水平方向每行像素值达到或者接近4096个)。

示例图片

  • 分辨率,是指图像的大小或尺寸,常见的分辨率有360P(640x360)、1080P(1920x1080)、4K(3840x2160)等等。常说的1080P和720P是指垂直像素数,分辨率除去垂直像素,还需要考虑到水平像素数,比如按照16:9(宽 : 高)的比例计算,720P的水平像素数为720÷9×16=1280,总计像素为921600像素,即大约为 92 万像素。1080P具有1920个水平像素,总计2073600像素,即约200万像素,是720P的两倍多。像素越多视频就越清晰,图像的分辨率越高,图像就越清晰。

示例图片

  • 位深,我们看到的彩色图片,都有三个通道,分别为红(R)、绿(G)、蓝(B)通道(如果需要透明度则还有alpha分量)。通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256x256x256=16777216=1677万种颜色。这里的8bit就是我们讲的位深。每个通道的位深越大,能够表示的颜色值就越大,比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色,1024x1024x1024约为107374万色=10亿色,是8bit的64倍。
  • 帧率,即FPS(每秒有多少帧画面),在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,比如25fps表示一秒有25张图片。玩游戏时,FPS帧率越高就代表游戏画面越流畅,越低则越卡顿,视频也是如此。由于视觉图像在视网膜的暂时停留,一般图像帧率能达到24帧,我们就认为图像是连续动态的。帧率越高,画面越流畅,需要的设备性能也越高。
  • 码率,也称比特率(Bit Rate),或叫位速率,是视频文件在单位时间内使用的数据流量。单位是bps(bit per second,位每秒),一般使用kbps(千位每秒)或Mbps(百万位每秒)。对于同一个原始图像源的时候,同样的编码算法,则码率越高,说明单位时间内取样率越大,图像的失真就会越小,视频画面就会越清晰。
  • Stride跨距,指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。Stride也被称作 Pitch,如果图像的每一行像素末尾拥有扩展内容,Stride的值一定大于图像的宽度值,就像下图所示:

示例图片

比如分辨率638x480的RGB24图像,我们在内存处理的时候如果要以16字节对齐,则638x3÷16=119.625(一个像素由RGB三个通道组成,所以乘3,一个通道8bit即1字节)不能整除,因此不能16字节对齐,我们需要在每行尾部填充6个字节。就是638+2=640,640x3÷16=120,此时该图片的Stride为1920字节。

2、RGB、YUV深入讲解

1)RGB、YUV概念

  • RGB,红、绿、蓝三基色。通常的图像像素是按RGB顺序进行排列,但有些图像处理要转成其他顺序,比如OpenCV经常转成BGR的排列方式。

示例图片

比如计算一张的RGB_888(每个像素用8bit表示)图像的大小,可采用如下方式:1280 × 720 x 3 = 2.637MB,4分钟就达到了15G的容量。假如是一部90分钟的电影,每秒25帧,则一部电影为2.637MB x 90分钟 x 60秒 x 25FPS = 347.651GB。

  • YUV,与RGB类似,YUV也是一种颜色编码方法,它是指将亮度参量或称灰阶值(Y:Luminance或Luma)和色度参量(UV:Chrominance或Chroma)分开进行表示的像素编码格式。这样分开不但可以避免相互干扰,没有UV信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题。降低色度的采样率也不会对图像质量影响太大,降低了视屏信号传输时对频宽(带宽)的要求。

示例图片

YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式:①打包(packed)格式,将每个像素点的Y、U、V分量交叉排列并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel)。②平面(planar)格式,使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中。

示例图片

2)YUV采样表示法

YUV采用A:B:C表示法来描述Y、U、V采样频率比例,下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。主要分为YUV4:4:4、YUV4:2:2、YUV4:2:0这几种常用的类型:

示例图片

  • 4:4:4表示色度频道没有下采样,即一个Y分量对应着一个U分量和一个V分量
  • 4:2:2表示2:1的水平下采样,没有垂直下采样,即每两个Y分量共用一个U分量和一个V分量
  • 4:2:0表示2:1的水平下采样,2:1的垂直下采样,即每四个Y分量共用一个U分量和一个V分量

3)YUV数据存储

下面以每个分量数据存储在一个char(或byte)中为例描述YUV的数据存储方式。比如I444(YUV444P)格式,对应ffmpeg像素表示:

AV_PIX_FMT_YUV444P, ///< planar YUV4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)

示例图片

比如I422(YUV422P)格式,对应ffmpeg像素表示:

AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)

示例图片

比如I420(YUV420P)格式,对应ffmpeg像素表示:

AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)

一帧为1280×720的视频帧,用YUV420P的格式来表示,其数据量大小的计算如下:先计算一个像素的数据量是 (4 + 1 + 1) / 4 = 1.5字节,即4个Y分量,对应1个U分量和1个V分量,除以4得到一个像素是1.5字节,再计算整个视频帧的数据量为 1280 x 720 x 1.5 = 1.318MB。如果fps(1秒的视频帧数目)是25,按照一般电影的长度90分钟来计算,那么这部电影用YUV420P的数据格式来表示的话,其数据量的大小就是:1.318MB x 25fps x 90min x 60s = 173.76GB。

再看NV12(YUV420SP)格式,对应ffmpeg像素表示:

AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)

示例图片

YUV420常用格式参考:

示例图片

4)RGB和YUV的转换

通常情况下RGB和YUV直接的相互转换都是调用接口实现,比如ffmpeg的swscale或者libyuv等库。

  • 主要转换标准是BT601和BT709,8bit位深的情况下:①TV range是16-235(Y)、16-240(UV) ,也叫Limited Range;②PC range是0-255,也叫Full Range;③而RGB没有range之分,全是0-255。
  • BT601 TV Range转换公式,YUV(256 级别)可以从8位 RGB 直接计算:
Y = 0.299*R + 0.587*G + 0.114*B;
U = -0.169*R - 0.331*G + 0.5*B;
V = 0.5*R - 0.419*G - 0.081*B;

反过来,RGB也可以直接从YUV(256级别)计算:

R = Y + 1.402(Y-128)
G = Y - 0.34414(U-128) - 0.71414(U-128)
B = Y + 1.772(V-128)
  • 从YUV转到RGB如果值小于0要取0,如果大于255要取255。

来看一个实际案例,为什么解码出错时显示绿屏?因为YUV分量初始化时为0值,解码失败时,根据公式:

R = 1.402*(-128) = -126.598
G = -0.34414*(-128) - 0.71414*(-128) = 44.04992 + 91.40992 = 135.45984
B = 1.772*(-128) = -126.228

RGB值范围为[0,255], 所以最终的值为:

R = 0
G = 135.45984
B = 0

此时只有G分量有值,所以为绿色。

5)YUV Stride对齐问题

比如分辨率638x480的YUV420P图像,我们在内存处理的时候如果要以16字节对齐,638不能被16整除,需要在每行尾部填充2个字节,就是640,此时该图片的Y stride为640字节。

示例图片

同理,UV分量也会有Stride。

3、I、P、B帧

  • I帧(Intra coded frames),不需要参考其他画面而生成,解码时仅靠自己就重构完整图像。I帧图像采用帧内编码方式,所占数据的信息量比较大,图像是周期性出现在图像序列中的,出现频率可由编码器选择。I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量),是帧组GOP的基础帧(第一帧),在一组中只有一个I帧。I帧不需要考虑运动矢量。
  • P 帧(Predicted frames),根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据,同时利用了空间和时间上的相关性。P帧属于前向预测的帧间编码,它需要参考前面最靠近它的I帧或P帧来解码。
  • B 帧(Bi-directional predicted frames),图像采用双向时间预测,可以大大提高压缩倍数。
  • 两个I帧之间形成一个GOP。DTS(Decoding Time Stamp)即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据,PTS(Presentation Time Stamp)即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

示例图片

4、常用视频压缩算法

  • MPEG2(MPEG阵营)
  • H264(MPEG阵营)
  • H265(MPEG阵营)
  • AVS(中国阵营)
  • VP8(Google阵营)
  • VP9(Google阵营)

四、音频基础

1、声音的物理性质

  • 波形。声音是一种由物体振动引发的物理现象,如小提琴的弦声等。物体的振动使其四周空气的压强产生变化,这种忽强忽弱变化以波的形式向四周传播,当被人耳所接收时,我们就听见了声音。

示例图片

声音是由物体的振动产生的,这种振动引起了周围空气压强的振荡,我们称这种振荡的函数表现形式为波形。

示例图片

  • 频率。声音的频率是周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。千赫(kHz),即1000Hz,表示每秒振动1000次。声音按频率可作如下划分:次声,0~20Hz,人耳能听见的声音,20Hz~20KHz,超声,20KHz~1GHz,特超声,1GHz~10THz。
  • 振幅。声音有振幅,振幅的主观感觉是声音的大小。声音的振幅大小取决于空气压力波距平均值(也称平衡态)的最大偏移量。

示例图片

2、数字音频

计算机并不直接使用连续平滑的波形来表示声音,它是每隔固定的时间对波形的幅值进行采样,用得到的一系列数字量来表示声音。右图是经过数字采样的波形示意图。

示例图片

PCM(Pulse Code Modulation),脉冲编码调制。人耳听到的是模拟信号,PCM是把声音从模拟信号转化为数字信号的技术。

  • 采样频率,每秒钟采样的点的个数。根据Nyguist采样定律,要从采样中完全恢复原始信号波形,采样频率必须至少是信号中最高频率的两倍。前面提到人耳能听到的频率范围是20H~20kHz,所以采样频率一般为44.1Khz,这样就能保证声音到达20Khz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。常用的采样频率有:无线广播为22kHz、CD音质为44.1kHz、数字电视/DVD为48kHz、蓝光/高清DVD为96kHz或192kHz。
  • 采样量化。采样是在离散的时间点上进行的,而采样值本身在计算机中也是离散的。采样值的精度取决于它用多少位来表示,这就是量化。例如8位量化可以表示256个不同值,而CD质量的16位量化可以表示65536个值,范围为-32768~32767。下图是一个3位量化的示意图,可以看出3位量化只能表示8个值:0.75,0.5,0.25,0,-0.25,-0.5,-0.75和-1,因而量化位数越少,波形就越难辨认,还原后的声音质量也就越差(可能除了一片嗡嗡声之外什么都没有):

示例图片

3、音频常见名词

  • 采样频率,每秒钟采样的点的个数。
  • 采样精度(采样深度),每个“样本点”的大小,常用的大小为8bit、16bit、24bit。
  • 通道数,单声道、双声道、四声道、5.1声道。
  • 比特率,每秒传输的bit数,单位为bps(Bit Per Second),间接衡量声音质量的一个标准。没有压缩的音频数据的比特率 = 采样频率 x 采样精度 x 通道数。
  • 码率,压缩后的音频数据的比特率。常见的码率:FM质量96kbps、一般质量音频128~160kbps、CD质量192kbps、高质量音频256-320Kbps。码率越大,压缩效率越低,音质越好,压缩后数据越大。码率 = 音频文件大小 / 时长。

示例图片

比如采样频率44100,采样精度16bit,2通道(声道),采集4分钟的数据:44100 x 16 x 2 x 4 x 60 = ‭338688000‬bit,‭338688000‬ ÷ 8 ÷ 1024 ÷ 1024 = 40M字节。比特率:采样频率 x 采样精度 x 通道数 = 44100 x 16 x 2 = 1411200bit/s。

  • 帧,每次编码的采样单元数,比如MP3通常是1152个采样点作为一个编码单元,AAC通常是1024个采样点作为一个编码单元。
  • 帧长,可以指每帧播放持续的时间,每帧持续时间(秒) = 每帧采样点数 / 采样频率(HZ),比如:MP3 48k,1152个采样点,每帧则为 1152 / 48000 = 0.024 秒 = 24毫秒;也可以指压缩后每帧的数据长度,所以要注意它适用的场合。
  • 交错模式,数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的左声道样本和右声道样本,再开始帧2的记录…

示例图片

  • 非交错模式,首先记录的是一个周期内所有帧的左声道样本,再记录所有右声道样本。

示例图片

4、音频编码原理简介

数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为:2 x 44.1kHz x 16bit = 1.411Mbit/s,如此大的带宽将给信号的传输和处理都带来许多困难和成本(阿里云服务器带宽大于5M后,每M价格是100元/月),因此必须采取音频压缩技术对音频数据进行处理,才能有效地传输音频数据。数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩,降低数据量。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等,例如人耳所能察觉的声音信号的频率范围为20Hz~20KHz,除此之外的其它频率人耳无法察觉,都可视为冗余信号。此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应。

  • 频谱掩蔽效应。一个频率的声音能量小于某个阈值之后,人耳就会听不到。当有另外能量较大的声音出现的时候,该声音频率附近的阈值会提高很多,即所谓的掩蔽效应。如图所示:

示例图片

由图中可以看出人耳对2KHz~5KHz的声音最敏感,而对频率太低或太高的声音信号都很迟钝,当有一个频率为0.2KHz、强度为60dB的声音出现时,其附近的阈值提高了很多。由图中可以看出在0.1KHz以下、1KHz以上的部分,由于离0.2KHz强信号较远,不受0.2KHz强信号影响,阈值不受影响;而在0.1KHz~1KHz范围,由于0.2KHz强音的出现,阈值有较大的提升,人耳在此范围所能感觉到的最小声音强度大幅提升。如果0.1KHz~1KHz范围内的声音信号的强度在被提升的阈值曲线之下,由于它被0.2KHz强音信号所掩蔽,那么此时人耳只能听到0.2KHz的强音信号而根本听不见其它弱信号,这些与0.2KHz强音信号同时存在的弱音信号就可视为冗余信号而不必传送。

  • 时域掩蔽效应。当强音信号和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三部分:

示例图片

时域掩蔽效应可以分成三种:前掩蔽,同时掩蔽,后掩蔽。前掩蔽是指人耳在听到强信号之前的短暂时间内,已经存在的弱信号会被掩蔽而听不到。同时掩蔽是指当强信号与弱信号同时存在时,弱信号会被强信号所掩蔽而听不到。后掩蔽是指当强信号消失后,需经过较长的一段时间才能重新听见弱信号,称为后掩蔽。这些被掩蔽的弱信号即可视为冗余信号。

  • 压缩编码方法。当前数字音频编码领域存在着不同的编码方案和实现方式,但基本的编码思路大同小异,如图所示:

示例图片

对每一个音频声道中的音频采样信号:
①将它们映射到频域中,这种时域到频域的映射可通过子带滤波器实现。每个声道中的音频采样块首先要根据心理声学模型来计算掩蔽门限值;
②由计算出的掩蔽门限值决定从公共比特池中分配给该声道的不同频率域中多少比特数,接着进行量化以及编码工作;
③将控制参数及辅助数据加入数据之中,产生编码后的数据流。

5、音频编解码器选型

  • OPUS,语音通话用得比较多
  • MP3
  • AAC
  • AC3和EAC3,杜比公司的方案

五、封装格式和音视频同步

  • 封装格式的概念。封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。比如:同样的馅可以做成饺子也可以做成包子。对于视频也是一个道理,同样的音视频流可以用不同容器来承载。

示例图片

  • 封装格式示例:

示例图片

这里的压缩算法,视频使用了H264/AVC压缩算法,音频使用了AAC压缩算法,封装则使用MP4封装格式。

  • 常见的视频封装格式:
    AVI、MKV、MPE、MPG、MPEG
    MP4、WMV、MOV、3GP
    M2V、M1V、M4V、OGM
    RM、RMS、RMM、RMVB、IFO
    SWF、FLV、F4V
    ASF、PMF、XMB、DIVX、PART
    DAT、VOB、M2TS、TS、PS
    H264+AAC封装为FLV或MP4是最为流行的模式。
  • 音视频同步概念:
    ①DTS(Decoding Time Stamp),即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
    ②PTS(Presentation Time Stamp),即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
    ③音频也有DTS和PTS。
  • 音视频同步方式:
    ①Audio Master,同步视频到音频;
    ②Video Master,同步音频到视频;
    ③External Clock Master,同步音频和视频到外部时钟。
    一般情况下 Audio Master > External Clock Master > Video Master。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值