音视频开发基础概念

一、音视频如何采集和表示

1、音视频录制原理

在这里插入图片描述

2、音视频播放原理

在这里插入图片描述

二、视频基础概念

1、图像基础概念

◼ 像素: 像素是一个图片的基本单位, pix是英语单词picture的简写, 加上英
语单词“元素element”, 就得到了“pixel”, 简称px, 所以“像素”有“图像元素”
之意。
◼ 分辨率: 是指图像的大小或尺寸。 比如1920x1080。
◼ 位深: 是指在记录数字图像的颜色时, 计算机实际上是用每个像素需要的
位深来表示的。 比如红色分量用8bit。
◼ 帧率: 在1秒钟时间里传输的图片的帧数, 也可以理解为图形处理器每秒钟
能够刷新几次。 比如25fps表示一秒有25张图片。
◼ 码率: 视频文件在单位时间内使用的数据流量。 比如1Mbps。
◼ Stride: 指在内存中每行像素所占的空间。 为了实现内存对齐每行像素在
内存中所占的空间并不一定是图像的宽度。

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

  例如2500×2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共是500万个像素,也俗称500万像素照片。
在这里插入图片描述
(2)分辨率
  图像(或视频)的分辨率是指图像的大小或尺寸。我们通常用像素表示图像的尺寸。例如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 的视频更加清晰。 图像的分辨率越高,图像就越清晰
在这里插入图片描述
在这里插入图片描述
  有些网站的分辨率显示是 720i 和 1080i,这个 i 又指的是什么?同样都是1080,1080i 和 1080p 哪个会更清晰?
  i 和 p 是指扫描方式, i 表示隔行扫描(Interlaced), p 则表示逐行扫描(Progressive),以 1080 的视频举例:

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

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

在这里插入图片描述

逐行扫描和隔行扫描的不同可以从含义和显示效果两方面理解:
1.含义上的区别
  逐行扫描也称为非交错扫描,通过扫描每行像素,在电子显示屏上“绘制”视频图像,每
一帧图像由电子束顺序地一行接着一行连续扫描而成。

  隔行扫描也就是交错扫描,最终是把每一帧图像通过两场扫描完成。

2.显示效果的区别
  逐行扫描克服传统扫描方式的缺陷,运动检测和运动补偿功能更加完善,并且显示稳定
性比隔行扫描强,动态失真程度低。

  隔行扫描有着较高的刷新率,改善了运动中物体的外观,空间分辨率比逐行扫描更高。

(3)位深
在这里插入图片描述
  我们看到的彩色图片,都有三个通道,分别为红®、 绿(G)、蓝(B)通道。(如果需要透明度则还有alpha分量)

  通常每个通道用8bit表示, 8bit能表示256种颜色,所以可以组成 256x256x256=16777216 = 1677万种颜色。这里的8bit就是我们讲的位深。

  每个通道的位深越大,能够表示的颜色值就越大,比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。

  1024x1024x1024约为107374万色, 是8bit的64倍。常见的颜色还是8bit居多。

(4)帧率
  帧率即 FPS(每秒要多少帧的画面),经常玩游戏的同学应该会对这个词很熟悉。我们玩游戏时, FPS 帧率越高就代表游戏画面越流畅,越低则越卡顿。视频也是如此。

电影帧率一般是 24fps(帧每秒);
电视剧一般是25fps; -> 现在的电视机可以 支持120帧
监控行业常用 25fps;
音视频通话常用15fps;

  帧率越高,画面越流畅,需要的设备性能也越高。

(5)码率

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

◼ 大多数情况下码率越高 分辨率越高,也就越清晰。但模糊的视频文件码率大小也
可以很大,分辨率小的视频文件可能也比分辨率大的视频文件清晰。

◼ 对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,
视频画面就会越清晰

在这里插入图片描述
(6)Stride跨距
Stride : 指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。

◼ Stride 就是这些扩展内容的名称, Stride 也被称作 Pitch,如果图像的每一
行像素末尾拥有扩展内容, Stride 的值一定大于图像的宽度值,就像下图所示:

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

RGB888一个像素点三个字节,R/G/B各占一个字节
在这里插入图片描述

2、RGB、 YUV深入讲解

◼ RGB: 红R、 绿G、 蓝B三基色。
◼ YUV: “Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表
示的则是色度(Chrominance或Chroma)。

◼ 通常的图像像素是按RGB顺序进行排列, 但有些图像处理要转成其他顺序,
比如OpenCV经常转成BGR的排列方式。

在这里插入图片描述

◼ 与我们熟知RGB类似, YUV也是一种颜色编码方法, 它是指将亮度参量(Y:Luminance
或Luma) 和色度参量(UV: Chrominance或Chroma) 分开进行表示的像素编码格式。

Luminance:亮度 Chrominance:色度

◼ 这样分开的好处就是不但可以避免相互干扰, 没有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
这几种常用的类型

◼ 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、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

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
RGB和YUV的转换-为什么解码出错显示绿屏?

因为解码失败时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 值范围为[0255], 所以最终的值为:
R = 0
G = 135.45984
B = 0
此时只有G分量有值所以为绿色。
YUV -> RGB

4、YUV Stride对齐问题

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

三、视频为什么要做编码

◼ 一张为720x480的图像,用YUV420P的格式来表示,其大小为: 720*480*1.5 约等于
 0.5MB。

◼ 如果是25帧, 10分钟的数据量 0.5M*10*60*25 = 7500MB -> 7GB多

◼ 视频编码压缩的目的是降低视频数据大小,方便存储和传输

在这里插入图片描述

为什么压缩的原始数据一般采用YUV格式?

◼ 视频编码是对一张张图像来进行的。 我们知道彩色图像的格式是 RGB 的, 但RGB 三个
颜色是有相关性的。

◼ 采用YUV格式, 利用人对图像的感觉的生理特性, 对于亮度信息比较敏感, 而对于色度
信息不太敏感, 所以视频编码是将Y分量和UV分量分开来编码的,并且可以减少UV分量,比
如我们之前说的YUV420P

视频压缩原理-数据冗余

	编码的目的是为了压缩,各种视频编码算法都是为了让视频体积变得更小,减少对存储
空间和传输带宽的占用。
	
	编码的核心是去除冗余信息,通过以下几种冗余来达到压缩视频的目的:
	1. 空间冗余: 图像相邻像素之间有较强的相关性, 比如一帧图像划分成多个 16x16 
的块之后,相邻的块很多时候都有比较明显的相似性。

	2. 时间冗余: 视频序列的相邻前后帧图像之间内容相似,比如帧率为 25fps 的视频
中前后两帧图像相差只有40ms,前后两张图像的变化较小,相似性很高。

	3. 视觉冗余: 我们的眼睛对某些细节不敏感,对图像中高频信息的敏感度小于低频信
息的。可以去除图像中的一些高频信息,人眼看起来跟不去除高频信息差别不大(有损压缩)5. 编码冗余(信息熵冗余): 一幅图像中不同像素出现的概率是不同的。对出现次数
比较多的像素,用少的位数来编码。对出现次数比较少的像素,用多的位数来编码,能够减
少编码的大小。比如哈夫曼编码。

图像帧的类型 (I帧、P帧和B帧)

I帧、 P帧和B帧是视频压缩领域中的基础概念,用于提升视频压缩效率、视频质量和视频
恢复能力。
◼ I帧(关键帧或帧内帧)仅由帧内预测的宏块组成。
◼ P帧代表预测帧,除帧内空域预测以外,它还可以通过时域预测来进行压缩。 P帧通过
使用已经编码的帧进行运动估计。
◼ B帧可以参考在其前后出现的帧, B帧中的B代表双向(Bi-Directional)。

在这里插入图片描述

四、音频基础概念

1、基本概念

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

在这里插入图片描述

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

在这里插入图片描述

2、声音的物理性质-频率-音频采样率

◼ 声音的频率是周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。
千赫(kHz),1000Hz, 表示每秒振动1000次。声音按频率可作如下划分:
	◼ 次声 020Hz
	◼ 人耳能听见的声音 20Hz~ 20KHz
	采样定理,两倍频率去采集,采集后可以再去还原出来的声音。
	◼ 超声 20KHz~ 1GHz
	◼ 特超声 1GHz~ 10THz
	
麦克风采集模拟世界20kh-》AD-》计算机采样2倍的20khz,48khz、44.1khz-》DA转换-》
喇叭播放

在这里插入图片描述

3、数字声音的表示

  现实中我们听到的声音是连续波的,但是在计算机中只能通过采样来复原波形。20khz 基本上是到顶 (采样定理, *2倍,所以 CD音质>40khz)
在这里插入图片描述

◼ 假设常用的采样频率44100,采样深度16bit,2通道(声道),采集4分钟的数据
	44100*16*2*4*60= 338688000bit
	338688000/8/1024/1024 = 40M字节
打电话是 深度为8bit的声音,不悦耳, 及时对方放歌曲也不动听。

◼ 没有经过压缩的音频数据我们叫PCM数据。PCM(Pulse Code Modulation,脉冲编码
调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码
转换成的标准数字音频数据。

4、音频主要概念

◼ 采样频率: 每秒钟采样的点的个数。常用的采样频率有:
	2200022kHz):无线广播。
	4410044.1kHz): CD音质。
	4800048kHz):数字电视, DVD。
	9600096kHz):蓝光,高清DVD。
	192000(192kHz):蓝光,高清DVD。

◼ 采样精度(采样深度) :每个“样本点”的大小
	常用的大小为8bit, 16bit, 24bit。
	浮点数表示,整数表示。
	浮点表示 -1~1
	整数(深度为16), -32768~32767 -> 除于32768 --1~1范围

◼ 通道数: 单声道,双声道, 3声道,四声道, 6声道。
  
 声道布局(channel layout):立体声(左右声道)、低音炮(2.1声道)5.1 环绕立体声

◼ 比特率: 每秒传输的bit数,单位为: bps(Bit Per Second)。
	间接衡量声音质量的一个标准。
	没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。
	
◼ 码率: 压缩后的音频数据的比特率。常见的码率:
	96kbps: FM质量
	128-160kbps:一般质量音频。
	192kbps: CD质量。
	256-320Kbps:高质量音频
	码率越大,压缩效率越低,音质越好,压缩后数据越大。
	码率 = 音频文件大小/时长

◼ 帧: 音频的帧的概念没有视频帧那么清晰, 几乎所有视频编码格式都可以简单的认
为一帧就是编码后的一张图像。

◼ 帧长:
(1) 可以指每帧采样数播放的时间, mp3 1152个采样点,每帧则为 24ms;
 aac则是每帧是1024个采样点。 攒够一帧的数据才送去做编码
(2) 也可以指压缩后每帧的数据长度。 所以讲到帧的时候要注意他适用的场合。

	每帧持续时间() = 每帧采样点数 / 采样频率(HZ)

◼ 交错模式: 数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的
左声道样本和右声道样本,再开始帧2的记录...

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

MP3
AAC
OPUS webrtc
AC3和EAC3 杜比公司的方案 交钱

在这里插入图片描述

五、封装格式基础

1、封装格式的概念

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

  一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。

  比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理,同样的音视频流可以用不同容器来承载。
在这里插入图片描述
在这里插入图片描述

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

2、常见的音视频封装格式

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

  FLV > mp4 > TS
  H264+AAC封装为FLV或MP4是最为流行的模式

六、音视频进阶需要学习什么项目

在这里插入图片描述
  除了上图还有live555也是不错的开源学习项目,不过这是用C++写的。

七、流媒体开发需要懂C/C++Linux吗

  坦白来说,需要也不需要,看你是基于什么方向去做,如果是基于硬件方案比如海思SDK,那就只用C,但是有时候也需要做一些纯软件的开发,这时候一般会用到C++,因为开发起来高效而且有许多开源的项目可以借鉴!

  总而言之,多会一门技能对自己只有好处,没有坏处,从个人长远的技术发展角度来看也是有利的!

猜你喜欢

转载自blog.csdn.net/weixin_45842280/article/details/127642739