音视频八股文(1)--音视频基础

1.1.音视频录制原理

image.png

1.2.音视频播放原理

image.png

1.3.图像表示RGB-YUV

1.3.1 图像基础概念

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

1.3.1.1 像素

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

1.3.1.2 分辨率

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

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

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

1.3.1.3 位深

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

image.png

1.3.1.4 帧率

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

1.3.1.5 码率

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

对比不同码率的转码。

1.3.1.6 Stride跨距

◼ Stride :指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。
◼ Stride 就是这些扩展内容的名称,Stride 也被称作 Pitch,如果图像的每一行像素末尾拥有扩展内容,Stride 的值一定大于图像的宽度值,就像下图所示:
◼ 比如分辨率638x480的RGB24图像,我们在内存处理的时候如果要以16字节对齐,则6383/16=119.625不能整除,因此不能16字节对齐,我们需要在每行尾部填充6
个字节。就是(638+2->640), 640
3/16=120。此时该图片的stride为1920字节。

image.png

1.3.2 RGB、YUV深入讲解

1.3.2.1 RGB

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

image.png

1.3.2.2 YUV

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

image.png

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

1.3.2.2.1 YUV采样表示法

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

image.png

1.3.2.2.2 YUV数据存储

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

  1. 4:4:4格式
  2. 4:2:2格式
  3. 4:2:0格式

image.png

image.png

image.png

image.png

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

image.png

1.3.2.3 RGB和YUV的转换

◼ 通常情况下RGB和YUV直接的相互转换都是调用接口实现,比如Ffmpeg的swscale或者
libyuv等库。
◼ 主要转换标准是 BT601 和 BT709。
YUV(256 级别) 可以从8位 RGB 直接计算:
Y = 0.299R + 0.587G + 0.114B;
U = -0.169
R - 0.331G + 0.5 *B ;
V = 0.5 *R - 0.419
G - 0.081*B;
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
谷歌的libyuv库

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

1.3.2.5 YUV Stride对齐问题

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

image.png

1.4.视频的主要概念

1.4.1 概念

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

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

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

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 帧图像采用双向时间预测,可以大大提高压缩倍数。

image.png

1.4.2 常用的视频压缩算法

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

音频基础-课程大纲
2.1 声音的物理性质
2.2 数字音频
2.3 音频基础名词
2.4 音频编码基本原理
2.5 音频编解码器选型

1.4.3 测试视频下载地址

1、地址:clips.vorwaerts-gmbh.de/big_buck_bu... 1分钟
2、地址:vjs.zencdn.net/v/oceans.mp4
3、地址:media.w3.org/2010/05/sintel/traile... 52秒
4、mirror.aarnet.edu.au/pub/TED-talks/... 10分

其他各种格式,MP4, flv, mkv, 3gp 视频下载
www.sample-videos.com/index.php#sa...

参考文档

看视频常见的 720p、1080p、4k,这些分辨率到底包含了什么
YUV详解:blog.csdn.net/u013898698/article/d...

1.5 音频

1.5.1 声音的物理性质

1.5.2.1 声音的物理性质-振动

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

1.5.2.1 声音的物理性质-频率

声音的频率是周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。千赫(kHz),即1000Hz,表示每秒振动1000次。声音按频率可作如下划分:
次声 0~20Hz
人耳能听见的声音 20Hz~20KHz
超声 20KHz~1GHz
特超声 1GHz~10THz

1.5.2.1 声音的物理性质-振幅

声音有振幅,振幅的主观感觉是声音的大小。声音的振幅大小取决于空气压力波距平均值(也称平衡态)的最大偏移量。
image.png

1.5.2 数字音频

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

image.png

1.5.2.1 数字音频-采样频率

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

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

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

1.5.2.2 数字音频-采样量化

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

下图是一个3位量化的示意图,可以看出3位量化只能表示8个值:0.75,0.5,0.25,0,─0.25,─0.5,─0.75和 ─1,因而量化位数越少,波形就越难辨认,还原后的声音质量也就越差(可能除了一片嗡嗡声之外什么都没有)
image.png

1.5.2.3 音频常见名词

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

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

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

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

码率: 压缩后的音频数据的比特率。常见的码率:
96kbps: FM质量
128-160kbps:一般质量音频。
192kbps: CD质量。
256-320Kbps:高质量音频

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

image.png

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

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

所以讲到帧的时候要注意他适用的场合。

image.png

1.5.3 音频编码原理简介

数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为:
244.1kHz16bit=1.411Mbit/s
如此大的带宽将给信号的传输和处理都带来许多困难和成本(阿里云服务器带宽大于5M后,每M价格是100元/月),
因此必须采取音频压缩技术对音频数据进行处理,才能有效地传输音频数据。

数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩,降低数据量。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。

冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。例如,人耳所能察觉的声音信号的频率范围为20Hz~20KHz,除此之外的其它频率人耳无法察觉,都可视为冗余信号。

此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应。

1.5.3.1 音频编码-频谱掩蔽效应

image.png

1.5.3.2 音频编码-时域掩蔽效应

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

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

image.png

1.5.3.3 音频编码-压缩编码方法

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

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

1.5.3.4 音频编解码器选型

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

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

1.6 封装格式的概念

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

封装的格式不一样,后缀名也就不一样。

比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理,同样的音视频流可以用不同容器来承载。

封装格式示例

!image.png

这里的压缩算法:
视频Video:使用了H264/AVC压缩算法
音频Audio:使用了AAC压缩算法

1.6.1 封装则使用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是最为流行的模式

1.7 音视频同步基础

1.7.1 音视频同步概念

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

1.7.2 音视频同步方式

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

一般情况下 Audio Master > External Clock Master > Video Master

1.7.3 音视频同步

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

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

image.png

1.7.4 其他

  1. 客户端的首帧秒开,本质上就是不做同步先把第一帧显示出来。
  2. 推流没有问题时,如果拉流不能正常播放:
  3. 没有声音:dump rtmp拉流后的数据是否可以正常播放
  4. 声音异常:是否有解码错误报告,重采样前的pcm数据是否正常
  5. 没有图像: dump rtmp拉流后的数据是否可以正常播放
  6. 画面异常:是否有解码错误报告,scale前的数据是否正常
    服务器首帧秒开:这个功能不能降低延迟
本作品采用《CC 协议》,转载必须注明作者和本文链接
微信公众号:福大大架构师每日一题。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
470
粉丝
21
喜欢
37
收藏
22
排名:457
访问:1.9 万
私信
所有博文
社区赞助商