对一个初学者来说,刚刚接触音视频的学习难免会遇到各种个样的术语,一开始我也是云里雾里的,到现在一点一点接触积累,形成一个基本的认识。本文并没有什么高深和详细的知识点,旨在记录一些音视频中涉及基本概念,以及它们的区别和联系。帮助初学者快速熟悉音视频开发。
一. 音视频处理流程
对音视频的处理流程可以简化为下图步骤:
image.png
图中流程在编码后有两种选择:
- 1.是通过封装保存为文件,比如录一段视频保存为 mp4 文件。
- 2.是直接将数据推给流媒体服务器,接收端可以从流媒体服务器拉取数据,比如直播。
图中的概念解释如下:
采集
采集就是通过麦克风、摄像头等途径采集音频数据和视频数据。
编码和解码
由于采集后的数据量大且冗余,因此需要进行编码,编码就是压缩。对应地,解码就是就解压缩。经常把编码和解码合在一起说为编解码。编码和解码经常涉及到的一个问题就是:软编解(软件编解码,软编/软解)和硬编解(硬件编解码,硬编/硬解)。
- 软编解:通过软件程序进行编解码,由 CPU 执行程序,性能较低,编解码后质量较高
- 硬编解:通过 GPU 等硬件进行编解码(GPU 适合做浮点等运算,不适合做逻辑处理),性能高,编解码后质量较低
封装和解封装,容器
封装又叫复用,解封装又叫解复用。一个视频文件中,通常包含着音频数据和视频数据,即一个视频文件包含两路数据流,一路视频流,一路音频流,有汉英切换的视频就有两路音频流。如何将已经编码压缩好的视频数据和音频数据按照一定的格式放到一个文件中的过程就叫做封装。而承载这些数据的封装格式,通常就叫做容器。例如 mp4 容器中有一路 H264 的视频流和一路 AAC 的音频流。相反地,从媒体文件或者媒体流中取出视频数据和音频数据的过程就叫做解封装或者解复用。
渲染
即将解码后的视频数据还原成图像,并显示的过程
二. 图像
其实音视频开发不只有音频和视频的处理,对图像的处理也是一个大的知识点。下面就会介绍一些入门级的图像相关的概念。
YUV 和 RGB
YUV 和 RGB 是一种色彩模型(color model),什么是色彩模型呢?就是用一组数值来描述颜色的抽象数学模型,常见就是 RGB (三原色), YUV (亮度色度),CMYK (印刷四原色)。它们的区别在于使用不同的规则来描述颜色 ,例如 RGB 模型用红、绿、蓝 3 个分量描述颜色,而 YUV 则使用的是亮度(Y)和色度(UV)。
有的地方也把 YUV 和 RGB 说成色彩空间 (color space) , 严格来说这种说法是不对的,颜色空间的定义的是颜色的范围,但是 YUV 和 RGB 表明的并不是一种颜色范围。对于开发来说我们只需要知道 YUV 和 RGB 的区别是对颜色的表示方式不同就足够了。
像素格式
像素格式描述了像素数据存储所用的格式,定义了像素在内存中的编码方式。
在图像的存储过程中,YUV 和 RGB 等通过不同的像素格式来存储图像。因此有时候我们说的 YUV , RGB 指的是一种像素格式。
通俗的讲,我们知道一张图像是由许多个像素点组成(像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值),每个像素都包含着颜色信息,以不同的方式来分离这些信息就产生不同的像素格式。例如将颜色信息分为亮度和色度的方式就是 YUV (YUV 也称 YCbCr , 或 YPbPr , 其中YUV通常用来描述电视的模拟信号,而 YCbCr 则是用来描述数字的影像信号,但是现在广泛使用的是 YUV 这种叫法),除此之外,将颜色信息分为红、绿、蓝三颜色的方式就是 RGB 。原本一个像素点的存储需要 3 个字节,即一个 YUV 分量 或 RGB 分量占一个字节,但在实际使用中为了减少图像数据的尺寸,YUV 和 RGB 有不同的方式来减少存储的数据量,从而产生了多种多样的 YUV 和 RGB 像素格式。
1. YUVxxx
YUV 通过采样的方式减少数据量。
人眼对色度的敏感程度低于对亮度的敏感程度。利用这个原理,可以把色度信息减少一点,人眼也无法查觉。
例如常见的 YUV444 , YUV422, YUV420 就是对 YUV 三个分量采样的不同而产生的不同的像素格式。
- YUV444, 以 4 四个像素点为一组,每 4 个 Y 分量就取 4 个 UV 分量,即全采样,大小为 24bpp (bits per pixel),即 3 字节 * 4 个像素点 * 8bits / 4 个像素点 = 24 bps
- YUV422, 以 4 四个像素点为一组,每 4 个 Y 分量就取 2 个 UV 分量,大小为 16bpp ,全采样的 2/3 ( ((U+V) * 2+ Y * 4) / ((U+V) * 4 + Y * 4) = 2/3)
-
YUV420, 以 4 四个像素点为一组,每 4 个 Y 分量就取 1 个 UV 分量, 大小为 12bpp ,全采样的 1/2 ( ((U+V) * 1+ Y * 4) / ((U+V) * 4 + Y * 4) = 1/2)
image.png
跨距 stride
目前 CPU 都是 32 位或者 64 位的,因此读取一次就是 4 个字节或者 8 个字节,如果不是 4 个字节或者 8 个字节对齐的,就需要额外的工作,比较耗时,因此有时会增加部分数据,进行内存对齐,使之达到 4、8 的倍数。
跨距 stride 的应用就是为了实现内存对齐,减少读取时间,提高效率。跨距就是指图像中的一行图像数据所占的存储空间的长度,它是一个大于等于图像宽度的内存对齐的长度。
image.png存储格式
YUV 在存储上按 YUV 三个分量的存储顺序不同可以分为三种格式:
- Planar 平面格式,也称为三面格式,即 YUV 三个分量分别按顺序保存,一个平面存储一个分量
- Semi-Planar 半平面格式,即两个平面,一个平面存储 Y,另外两个平面存储 UV 分量。
- Packed 打包格式,只有一个平面,所有亮度(Y)和色度(UV)数据都交织在一起。
(1)YU12 ( I420, IYUV )
- 4:2:0:即四个像素点为一组,其中 4 个 Y 分量共一组 UV 分量。一个分量 1 字节,因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 3 Planars
Y | Y | Y | Y |
---|---|---|---|
Y | Y | Y | Y |
U | U | ||
V | V |
假设内存对齐为 4 字节,像素宽高为 4 * 2, stride 为大于宽的 4 的倍数
- Y 平面的 宽为4 , 高为 2 , stride 为 4
- U 平面的 宽为2 , 高为 1 , stride 为 4
- V 平面的 宽为2 , 高为 1 , stride 为 4
(2)YV12
和 YU12 类似,只是改变了 UV 平面的顺序。
- 4:2:0:即四个像素点为一组,其中 4 个 Y 分量共一组 UV 分量。一个分量 1 字节,因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 3 Planars
Y | Y | Y | Y |
---|---|---|---|
Y | Y | Y | Y |
V | V | ||
U | U |
假设内存对齐为 4 字节,像素宽高为 4 * 2, stride 为大于宽的 4 的倍数
- Y 平面的 宽为4 , 高为 2 , stride 为 4
- V 平面的 宽为2 , 高为 1 , stride 为 4
- U 平面的 宽为2 , 高为 1 , stride 为 4
(3)NV12
- 4:2:0:即四个像素点为一组,其中 4 个 Y 分量共一组 UV 分量。一个分量 1 字节,因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 2 Planars,两个平面,分别存储 Y 分量 和 UV 分量。其中 UV 分量共用一个平面并且以 U, V, U, V 的顺序交错排列。每四个 Y 分量共享一组 UV 分量。
Y | Y | Y | Y |
---|---|---|---|
Y | Y | Y | Y |
U | V | U | V |
假设内存对齐为 4 字节,像素宽高为 4 * 2, stride 为大于宽的 4 的倍数
- Y 平面的 宽为4 , 高为 2 , stride 为 4
- UV 平面的 宽为4 , 高为 1 , stride 为 4
NV12 是 iOS 相机可直接输出的两种视频帧格式之一,另外一种是 BGRA32。
(4)NV21
- 4:2:0:即四个像素点为一组,其中 4 个 Y 分量共一组 UV 分量。一个分量 1 字节,因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 2 Planars,两个平面,分别存储 Y 分量 和 UV 分量。其中 UV 分量共用一个平面并且以 V, U, V, U 的顺序交错排列。每四个 Y 分量共享一组 UV 分量。
Y | Y | Y | Y |
---|---|---|---|
Y | Y | Y | Y |
V | U | V | U |
假设内存对齐为 4 字节,像素宽高为 4 * 2, stride 为大于宽的 4 的倍数
- Y 平面的 宽为4 , 高为 2 , stride 为 4
- VU 平面的 宽为4 , 高为 1 , stride 为 4
NV21 是 Android 相机默认的格式
2.RGBxxx
RGB 则是对使用的位数进行缩减
例如常见的 RGB888, RGB565 就是通过减少整个存储的位数来减少像素点的存储大小。
- RGB24, 即 RGB 888, 每个分量用 8bit 来存储,大小为 24bpp。
- RGB565, 即 R 分量占据 5 bit ,G 分量占 6 bit,B 分量占 5 bit, 大小为 16 bpp 。
- RGBA, 即在原来的 RGB 分量上多一个 A (Alpha )透明度, 大小为 32 bpp。
3. JPEG 、PNG 和 BMP 等
有了图像的原始数据(YUV 或 RGB 数据),有时我们需要将原始数据进行存储,如果不进行压缩的话,保存图像需要的空间将十分大。800w 像素的 YUV420 格式数据大小为 12M(326424483B*0.5)。不同的压缩方式就产生了不同的图片格式,通常这个过程就叫做编码,将 YUV 数据编码成 JPEG 的意思就是将 YUV 数据按 JPEG 的图像压缩标准进行压缩。
原始数据的压缩也叫编码,将压缩后的数据进行还原就叫做解码,因此在处理图像或者视频涉及到的编解码实际上就是对原始数据的压缩和对压缩后的数据的还原。编解码的过程常常由对应的编解码器来完成,不同的编解码器实现了不同的压缩还原算法,例如 JPEG 编解码器就实现了 JPEG 压缩算法。
(1) JPEG
JPEG 也叫 JPG (因 DOS、Windows 95等早期系统采用的 8.3 命名规则只支持最长 3 字符的扩展名,为了兼容采用了 .jpg。也因历史习惯和兼容性考虑,.jpg 目前更流行)
JPEG格式也是应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,将不易被人眼察觉的图像颜色删除。
(2) PNG
PNG:采用一种基于 LZ77 派生算法的无损数据压缩。其支持支持透明效果,在图像边缘和背景显得更平滑。
(3) BMP
BMP:Windows系统下的标准位图格式,未经过压缩,一般图像文件会比较大。
其他 svg , gif ,webp 等都是图像的格式,这里就不做展开说明。
三. 音频
1. 音频数据
(1) 声音数据的由来
声音实际上是一种声波,包括我们说话的时候,就是不断的产生声波,既然是一种波,就可以在图上画出它的波形图,一个波形图对应的几个重要参数:振幅,就是这个波形的高度,反映成声音的话就是声音越大,这个振幅就越大,波峰也就越高,还有一个就是频率,对应波峰之间的距离,越近频率就越高,说明声音的音调也就越高。
采集.png我们处理音频的时候是直接对音频做数据处理,因此还需要对音频做数字化,一般数字化处理后,进行计算等操作,重新播放的过程可以简单概括为下面几个。
播放流程.png
关键的地方是模数的转换和量化编码,模拟信号转变成数字信号时涉及到一个采样的的过程,即相隔一个固定的时间,对模拟信号进行一次采样,并把信号量化成一个离散的数字表示。这个采样的频率,就是我们说的采样率,即每秒进行多少次采样。
采样.png(2) 采样率的确定
采样率,即每秒进行多少次采样。
- 根据奈魁斯特(NYQUIST)采样定理,用两倍于一个正弦波的频率进行采样就能完全真实地还原该波形。
- 傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。
- 人的发声频率范围大概是300Hz~3400Hz,所以,8kHz的采样率已经能够满足人们语音通话的需求。
- 由于人耳的听觉频率范围是 20Hz~20kHz(能听到的声音的频率),44.1 kHz 可以重现频率低于 20 kHz 的所有音频。
(3) 位深和采样分辨率
一个采样点用多少位来表示,位数越多,所能表示的音频信号分辨率就越高。采样声波时,为每个采样指定最接近原始声波振幅的振幅值。较高的位深度可提供更多可能的振幅值,产生更大的动态范围、更低的噪声基准和更高的保真度。目前最常用的是每个采样点16位。
(3) 声道
单声道、立体声,指的就是这里要讲的声道。声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号。
通过上面的数据即可计算一段音频裸数据的大小
数据量(byte)= (采样频率(Hz)× 采样位数(bit) × 声道数)x 时间(s)/ 8
2. 音频格式
(1) PCM
PCM:脉冲编码调制,对声音进行采样,量化过程,未经过任何编码和压缩处理的数据。因为 PCM 数据完整无损,所以 PCM 数据音质好但是体积大,所以也产生了对音频压缩的各种方式。常见的有国际标准化组织 ISO 所提出的 MPEG 系列标准和杜比公司的 AC 系列标准。
有损压缩和无损压缩:
有损音频格式是指经过压缩后产生的新文件所保留的声音信号,相对于原来的格式的信号而言有所削减的有损压缩,有损压缩方法也称信息量压缩。这种压缩方法利用了人类视觉或者人类听觉对图像或声音中的某些频率成分不敏感的特性,从原始数据中将这不敏感的一部分数据去除,以达到压缩的目的。
无损压缩是指经过压缩后产生的新文件所保留的声音信号,相对于原来格式的信号完全相同,没有削减的压缩是无损压缩,也称冗余度压缩。它利用数据的统计冗余进行压缩,这种压缩方法从数学上讲是一种可逆运算,还原后和压缩编码前的数据完全相同。
(2) MP3
MP3 是应用于 MPEG-1 的音频压缩标准,英文全称是 MPEG-1 Audio Layer3。
MP3 是利用人耳对高频声音信号不敏感的特性,对高频加大压缩比,对低频信号使用小压缩比,保证信号不失真。 保留能听到的低频部分。MP3 是有损压缩。
(3) AAC
AAC(Advanced Audio Coding),基于 MPEG-2 的音频编码技术。2000年,MPEG-4 标准出现后,AAC 重新集成了其特性,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。AAC 是有损压缩
(4) WAV
WAV :是是微软公司专门为 Windows 开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。 WAV 是有损压缩。
四. 视频
1. 帧
帧是视频开发常见的一个基本概念,可以表示为一张画面,一个段视频本质上就是有许多画面组成,因此,一个视频就是由许许多多的视频帧组成。
在视频数据的压缩处理中,每帧都代表着一副画面,由于视频前后两帧的画面极为相似,因此可以通过前一帧的画面数据来进行压缩或者解压缩,根据参考的帧的不同,可以划分为 I 帧、P 帧 和 B 帧。
- I 帧:(Intra Picture)帧内编码帧,也叫关键帧,I 帧不需要参考其他帧就可以进行解码。
- P 帧:(Predictive-Frame)向前预测编码帧,即需要参考前面的一帧才能进行解码。
- B 帧:(bi-directional interpolated prediction frame)双向预测内插编码帧,也叫双向预测帧。即需要参考前面已编码的帧,又需要参考图像序列后面的已编码帧,才能进行解码。
2. GOP
GOP ,Group of Picture ,指的是两个 I 帧之间的间隔。
3. PTS 和 DTS
由于存在 B 帧和 P 帧,因此某一帧的解码顺序和显示顺序有可能是不一样的,因此就有课 PTS 和 DTS 的概念。
- DTS, Decoding TimeStamp 解码时间戳,用于告诉解码器什么时候解码。
- PTS, Presentation TimeStamp 显示时间戳,用于告诉播放器在什么时候显示这一帧。
4. 帧率
fps, Frames Per second。每秒显示的、传输的帧数。帧率和视频流畅度有关,帧率越大视频越流畅,帧率越小视频就会卡。通常设置帧率为 25 fps,因为当帧率大于 24 fps 时,画面对人眼视觉效果是连续的。
5. 分辨率
分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。常见有1280x720(720P),表示水平方向有 1280 个像素,竖直方向有 720 个像素。对于固定显示的宽高,分辨率越高,图像大小越大,越清晰;分辨率越低,图像大小越小,如果固定宽高大于图像分辨率,那么图像就会变模糊。
6. 码率
bps, Bits per second。指的是每秒传送的数据位数。常见的单位 kbps (k bits per s) 和 mbps (m bits per s) 。帧率越大,每秒传输的帧数越大;分辨率越大,每一帧的内容大小越大;因此帧率越大,分辨率越大,码率就越大。
7. 码流
流的概念实际上指的就是持续的视频数据。比如采集后的视频数据流,常称为裸流,如果是 YUV 格式的,称为 YUV 流。经过 H264 编码的,称为 H264 码流。在视频流处理中,如果从裸流到 H264 码流的过程,称为编码,反之则称为解码。
8.H26x 和 MPEGx
图像可以压缩,视频也不例外。
有了原始数据 YUV 后,因为视频前后两帧图像由很多相似之处等特点,因此原始视频数据还有很大的压缩空间,如果不对原始数据进行压缩,那么由这些原始数据组成的视频就很大,自然在网络传输的时候对带宽的要求就增大。对此,就产生了不同的视频压缩标准,由 ITU(国际电传视讯联盟) 主导制定了 H.26x 系列的视频压缩标准;而由 ISO (国际标准组织机构) 开发了 MPEG 系列的视频标准,后来两个组织还一起合作制定了一些标准,因此有的时候,虽然是同一个标准但是有不同的名字 H.26x 或者 MPEGx 。两者的关系大致如下:
image.pngH264 也称 MPEG-4 ,AVC
H265 也称 MPEG-H , HEVC
9. 视频的封装
一个视频文件中,通常包含着音频数据和视频数据,一个视频文件包含两路数据流,一路视频流,一路音频流,有汉英切换的视频就有两路音频流。如何将已经编码压缩好的视频数据和音频数据按照一定的格式放到一个文件中的过程就叫做封装,而承载这些数据的封装格式,通常就叫做容器。例如 mp4 容器中有一路 H264 的视频流和一路 AAC 的音频流。常见的视频封装格式有 Mp4、Flv 和 AVI 等。
(1) AVI
AVI 英文全称为 Audio Video Interleaved,即音频视频交错格式,是微软公司推出的作为其 Windows 视频软件一部分的一种容器格式。AVI 文件将音频和视频数据包含在一个文件容器中,允许音视频同步回放。
(2) MP4
MP4 英文全称为 MPEG-4 Part 14,属于 MPEG-4 的一部分。被认为可以在其中嵌入任何形式的数据,,不过我们常见的大部分的 MP4 文件存放的 AVC(H.264) 或 MPEG-4(Part 2) 编码的视频和 AAC 编码的音频。
(3) FLV
FLV 英文全称为 flash video 。一个 FLV 文件由一个 FLV Header 和 多个 FLV body 组成,一个 FLV body 由 previousTagSize 和 tag 组成,而 tag 则分为 video、audio或者scripts,每个 tag 就包含着音频或者视频数据。
(4) TS
TS 的全称则是 Transport Stream,属于 MPEG2-TS 。MPEG2-TS 格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。因此常见的 ts 文件都是完整视频的一个小片段,由所有的 ts 文件组成一个完整的视频。
10. 流媒体协议
RTMP、HLS 和 HTTP-FLV 是属于直播流媒体协议。
(1) RTMP
RTMP 全称 Real Time Messaging Protocol,即实时消息传送协议。RTMP 是工作在 TCP 之上的协议,默认使用端口 1935。协议中的基本数据单元成为消息,传输的过程中消息会被拆分为更小的消息块。最后将分割后的消息块通过 TCP 协议传输,接收端再反解接收的消息块恢复成流媒体数据
(2) HLS
HLS 是 Apple 推出的直播协议,是通过视频流切片成文件片段来直播的。首先会请求一个m3u8 文件,里面会有不同码率的流,或者直接是 ts 文件列表,通过给出的 ts 文件地址去依次播放。在直播的时候,会不断请求 m3u8 文件,检查 ts 列表是否有新的 ts 切片。
简单地说 HLS 协议使用地视频的封装格式是 TS。除了 TS 视频文件本身,还定义了用来控制播放的m3u8 文件(文本文件)。
m3u8 是 Unicode 版本的 M3U,用 UTF-8 编码。“m3u” 和 “m3u8” 文件都是 HLS 协议格式的基础,m3u8 文件实质是一个播放列表,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源,由此可知,整个视频的总时长就是各个.ts切片资源的时长之和。
HLS 的播放过程时下载的m3u8 内容
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
(3) HTTP-FLV
HTTP-FLV 即将流媒体数据封装成 FLV 格式,然后通过 HTTP 协议传输。
其依靠 MIME 的特性,根据协议中的 Content-Type 来选择相应的程序去处理相应的内容,使得流媒体可以通过 HTTP 传输。
![欢迎关注我的微信公众号【海盗的指针】]
网友评论