音视频基础知识

音视频基础知识

音视频录制原理

请添加图片描述

音视频播放原理

请添加图片描述

图像表示RGB-YUV

图像基础概念

  • 像素:像素是一个图片的基本单位,pix是英语单词picture的简写,加上英语单词“元素element”,就得到了“pixel”,简称px,所以“像素”有“图像元素”之意。

  • 分辨率:是指图像的大小或尺寸。比如1920x1080。

  • 位深:是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深来表示的。比如红色分量用8bit。

  • 帧率:在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。比如25fps表示一秒有25张图片。

  • 码率:视频文件在单位时间内使用的数据流量。比如1Mbps。

  • 跨距(Stride):指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。

像素

像素是一个图片的基本单位,pix是英语单词picture的简写,加上英语单词“元素element”,就得到了“pixel”,简称px,所以“像素”有“图像元素”之意。例如2500×2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共是500万个像素,也俗称500万像素照片。

分辨率

图像(或视频)的分辨率是指图像的大小或尺寸。我们通常用像素表示图像的尺寸。例如2500×2000的照片就是指横向(宽)有2500个像素点,竖向(高)有2000个像素点。
常见的分辨率:360P(640x360)、720P(1280x720)、1080P(1920x1080)、4K(3840x2160)、8K(7680x4320)

分辨率-不同分辨率之间的区别

常说的 1080 和 720 其实是指垂直像素数,分辨率除去垂直像素,还需要考虑到水平像素数。按照 16:9(宽 : 高)的比例计算,720p 的水平像素数为 720 ÷ 9 × 16 = 1280,总计像素为921600像素即大约为 92 万像素。1080p 具有 1920 个水平像素,总计2073600像素即约 200 万像素,是 720p 的两倍多。

像素越多视频就越清晰,所以 1080p 比 720p 的视频更加清晰。图像的分辨率越高,图像就越清晰。

位深

我们看到的彩色图片,都有三个通道,分别为红®、绿(G)、蓝(B)通道(如果需要透明度则还有alpha分量)。通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256*256*256=16,777,216 = 1677万种颜色。这里的8bit就是我们讲的位深。
每个通道的位深越大,能够表示的颜色值就越大,比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。1024*1024*1024约为10,7374万色=10亿色, 是8bit的64倍。常见的颜色还是8bit居多。

帧率

帧率即 FPS(每秒有多少帧画面),经常玩游戏的同学应该会对这个词很熟悉。我们玩游戏时,FPS 帧率越高就代表游戏画面越流畅,越低则越卡顿。视频也是如此。
由于视觉图像在视网膜的暂时停留,一般图像帧率能达到24帧,我们就认为图像是连续动态的。
常见帧率:电影帧率一般是 24fps(帧每秒);电视剧一般是25fps;监控行业常用 25fps;音视频通话常用15fps;
帧率越高,画面越流畅,需要的设备性能也越高。

码率

视频文件在单位时间内使用的数据流量。比如1Mbps。大多数情况下码率越高,分辨率越高,也就越清晰。但模糊的视频文件大小(码率)也可以很大,分辨率小的视频文件可能也比分辨率大的视频文件清晰。对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,视频画面就会越清晰。

跨距(Stride)

跨距(Stride)指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。跨距(Stride)就是这些扩展内容的名称,Stride 也被称作 Pitch,如果图像的每一行像素末尾拥有扩展内容,Stride 的值一定大于图像的宽度值,就像下图所示:

在这里插入图片描述

比如分辨率638x480的RGB24图像,我们在内存处理的时候如果要以16字节对齐,则6383/16=119.625不能整除,因此不能16字节对齐,我们需要在每行尾部填充6个字节。就是(638+2->640), 6403/16=120。此时该图片的stride为1920字节。

RGB、YUV深入讲解

RGB

我们前面已经讲过RGB色彩表示,这里我们重点讲RGB的排列。通常的图像像素是按RGB顺序进行排列,但有些图像处理要转成其他顺序,比如OpenCV经常转成BGR的排列方式。

在这里插入图片描述

YUV

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

YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式:

  • 打包(packed)格式:将每个像素点的Y、U、V分量交叉排列并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel)。
  • 平面(planar)格式:使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中。

在这里插入图片描述

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

在这里插入图片描述

下面以每个分量数据存储在一个char(或byte)中为例描述YUV的数据存储方式。

  1. 4:4:4格式

  2. 4:2:2格式

  3. 4:2:0格式

在这里插入图片描述

YUV数据存储-4:2:0格式:

在这里插入图片描述

RGB和YUV的转换

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

YUV(256 级别) 可以从8位 RGB 直接计算:

Y = 0.299R + 0.587G + 0.114B
U = -0.169R - 0.331*G + 0.5B
V = 0.5 R - 0.419G - 0.081B

8bit位深的情况下,TV range是16-235(Y)、16-240(UV) , 也叫Limited Range;PC range是0-255,也叫Full Range。而RGB没有range之分,全是0-255。

反过来,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分量有值所以为绿色。

YUV Stride对齐问题

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

在这里插入图片描述

视频的主要概念

概念

视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。

视频帧率:fps,通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,给人的视觉就越流畅。

视频分辨率:分辨率就是我们常说的640x480分辨率、1920x1080分辨率,分辨率影响视频图像的大小。

不同的分辨率之间具体有什么区别呢?我们下面就以 720p、1080p 为例进行说明。

我们常说的 1080 和 720 其实是指垂直像素数,分辨率除去垂直像素,还需要考虑到水平像素数。按照 16:9 (宽 : 高) 的比例计算,720p 的水平像素数为 720 ÷ 9 × 16 = 1280,总计像素为921600像素即大约为 92 万像素。1080p 具有 1920 个水平像素,总计2073600像素即约 200 万像素,是 720p 的两倍多。

而像素越多视频就越清晰,所以 1080p 比 720p 的视频更加清晰。

已经解释了 720 和 1080 这两个数字的含义,那后面跟着的 p 又是指什么呢?甚至还有些网站的分辨率显示是 720i 和 1080i,这个 i 又指的是什么?同样都是1080,1080i 和 1080p 哪个会更清晰?

其实 i 和 p 是指扫描方式,i 表示隔行扫描,p 则表示逐行扫描,以 1080 的视频举例:

  • 1080i:1920 x 1080 分辨率。隔行扫描模式下的高清图像是隔行显示的。每一个奇数行图像都在每一偶数行图像后面显示出来。比如将 60 帧分成两部分,奇数帧只扫描 1,3,5,7,9… 行,偶数帧只扫描 2,4,6,8,10… 行。理论上人眼是察觉不出来画面不连续,反而是由于视觉残留,能自动将两帧叠加在一起。

  • 1080p:1920x1080 分辨率。和 1080i 的区别就在于 1080p 不是隔行扫描,是逐行扫描。每一线都同时表现在画面上,因此比隔行扫描电视更加的平滑。

分辨率、帧率和码率三者之间的关系,我们以不同的基准来看一下。

当我们以码率为中心时:

  • 如果码率为变量,那么帧率就会影响视频的体积,帧率越高,每秒钟经过的画面越多,编码器每秒编出的数据也就越大,那么视频体积也就越大。分辨率则影响图像大小,分辨率越高,像素越多,则图像越大;反之图像越小。
  • 而当码率不变时,分辨率与清晰度成反比关系:分辨率越高,需要的码率就会变高,但是此时码率不变,就会导致图像越不清晰。反之分辨率越低,图像越清晰,但是图像也会越小。

如果以分辨率为中心:

  • 当分辨率不变时,码率与清晰度成正比关系:码率越高,图像越清晰;反之码率越低,图像越不清晰。

所以,一个好的画质并不是盲选最高的分辨率就可以,而是需要平衡好分辨率、帧率以及码率,某一个值偏高都会让画质受收到影响。

然而这就带来了一个问题,如果一个视频的分辨率达到 720p、1080p 甚至更高,同时完美平衡了码率、帧数,我们会发现,视频的体积会变得相当大,这让视频在网络传输中对网速的要求迅速提升,甚至不进行处理会出现无法正常播放的情况。

I 帧(Intra coded frames):I帧不需要参考其他画面而生成,解码时仅靠自己就重构完整图像。

  • I帧图像采用帧内编码方式;
  • I帧所占数据的信息量比较大;
  • I帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。
  • I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)。
  • I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧。
  • I帧不需要考虑运动矢量。

P 帧(Predicted frames):根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据,同时利用了空间和时间上的相关性。
P帧属于前向预测的帧间编码。它需要参考前面最靠近它的I帧或P帧来解码。
B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。

在这里插入图片描述

常用的视频压缩算法

MPEG阵营:MPEG2 、H264、H265(HEVC)。中国阵营:AVS 。Google阵营:VP8、VP9。

音频

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

声音的物理性质

  • 波形:声音是由物体的振动产生的,这种振动引起了周围空气压强的振荡,我们称这种振荡的函数表现形式为波形。
  • 频率:声音的频率是周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。千赫(kHz),即1000Hz,表示每秒振动1000次。声音按频率可作如下划分:次声(0~20Hz)、人耳能听见的声音(20Hz~20KHz)、超声(20KHz~1GHz)、特超声(1GHz~10THz)。
  • 振幅:振幅的主观感觉是声音的大小。声音的振幅大小取决于空气压力波距平均值(也称平衡态)的最大偏移量。

数字音频

音频常见名词:

  • 采样频率:每秒钟采样的点的个数。

  • 采样精度(采样深度):每个“样本点”的大小,常用的大小为8bit, 16bit,24bit。

  • 通道数:单声道,双声道,四声道,5.1声道。

  • 比特率:每秒传输的bit数,单位为:bps(Bit Per Second),间接衡量声音质量的一个标准。没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。

  • 码率: 压缩后的音频数据的比特率。码率越大,压缩效率越低,音质越好,压缩后数据越大。 码率 = 音频文件大小/时长。

    常见的码率:

    96kbps:FM质量。
    128-160kbps:一般质量音频。
    192kbps: CD质量。
    256-320Kbps:高质量音频。

  • :每次编码的采样单元数,比如MP3通常是1152个采样点作为一个编码单元,AAC通常是1024个采样点作为一个编码单元。

  • 帧长:可以指每帧播放持续的时间,每帧持续时间(秒) = 每帧采样点数 / 采样频率(HZ)。比如:MP3 48k,1152个采样点,每帧则为1152/48000=0.024 秒=24毫秒。帧长也可以指压缩后每帧的数据长度。

  • 交错模式与非交错模式:交错模式指数据以连续帧的方式存放。首先记录帧1的左声道样本和右声道样本,再开始帧2的记录,以此类推;非交错模式指先记录一个周期内所有帧的左声道样本,再记录右声道样本。

为了将模拟信号数字化,本节将分为3个概念进行讲解:采样频率、采样量化、编码。

在这里插入图片描述

采样频率

根据Nyguist采样定律,要从采样中完全恢复原始信号波形,采样频率必须至少是信号中最高频率的两倍。

前面提到人耳能听到的频率范围是20Hz~20kHz,所以采样频率一般为44.1Khz,这样就能保证声音到达20Khz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。

采样频率:每秒钟采样的点的个数。常用的采样频率有:
22000(22kHz): 无线广播。
44100(44.1kHz): CD音质。
48000(48kHz): 数字电视,DVD。
96000(96kHz): 蓝光,高清DVD。
192000(192kHz): 蓝光,高清DVD。

采样量化

采样是在离散的时间点上进行的,而采样值本身在计算机中也是离散的。采样值的精度取决于它用多少位来表示,这就是量化。例如8位量化可以表示256个不同值,而CD质量的16位量化可以表示65536个值,范围为[-32768, 32767]。

举个例子,3位量化只能表示8个值:0.75、0.5、0.25、0、-0.25、-0.5、-0.75和-1,因而量化位数越少,波形就越难辨认,还原后的声音质量也就越差。

音频编码

数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为2*44.1kHz*16bit=1.411Mbit/s。如此大的带宽将给信号的传输和处理都带来许多困难和成本,因此必须采取音频压缩技术对音频数据进行处理,才能有效地传输音频数据。

数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩,降低数据量。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。例如,人耳所能察觉的声音信号的频率范围为20Hz~20KHz,除此之外的其它频率人耳无法察觉,都可视为冗余信号。此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应。

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

音频编解码器选型:OPUS、MP3、AAC、AC3和EAC3。

参考:《详解音频编解码的原理、演进和应用选型等 - 知乎 (zhihu.com) 》

封装格式的概念

封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。

常见的视频封装格式: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。H.264+AAC封装为FLV或MP4是最为流行的模式。

在这里插入图片描述

视频编码数据

作用:将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。

音频编码数据

作用:将音频采样数据(PCM 等)压缩成为音频码流,从而降低音频的数据量。

音视频同步基础

音视频同步概念

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

音视频同步方式

  • Audio Master:同步视频到音频
  • Video Master:同步音频到视频
  • External Clock Master:同步音频和视频到外部时钟。

一般情况下的表现情况:Audio Master > External Clock Master > Video Master。

音视频同步

Avsync模块,目前只支持audio master的方式。

各个模块关键时间点的监测:

在这里插入图片描述

其他

客户端的首帧秒开,本质上就是不做同步先把第一帧显示出来。这个功能不能降低延迟。

推流没有问题时,如果拉流不能正常播放:

  1. 没有声音:dump rtmp拉流后的数据是否可以正常播放
  2. 声音异常:是否有解码错误报告,重采样前的pcm数据是否正常
  3. 没有图像: dump rtmp拉流后的数据是否可以正常播放
  4. 画面异常:是否有解码错误报告,scale前的数据是否正常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值