音视频基础知识
1.视频录制原理
- 视频录制的原理涉及多个步骤,包括音频和视频数据的采集、处理、编码、复用,以及最终的文件生成。具体过程如下:
1.1 音频和视频数据采集
- 通过麦克风和摄像头等硬件设备采集音频和视频信息。麦克风将声音转换成模拟信号(采样帧PCM),摄像头则捕获图像帧(RGB/YUV(大部分都是))。
1.2 音频和视频数据处理
- 采集到的音频和视频数据会进入队列,等待进一步处理,如降噪、图像缩放等。
1.3 音频和视频数据编码
- 处理后的数据通过特定的编码算法(如MP3、AAC、H264)进行编码,转换成数字格式,以便计算机理解。
1.4 音频和视频数据包复用
- 编码后的数据包进入队列等待复用,复用器将音频和视频数据包合并成一个文件(MP4/FLV),这个文件可以在媒体播放器中播放。
1.5 生成录制文件
- 最后,复用后的数据被写入文件,完成整个录制过程。
说明
- 时钟:采集的每一帧数据都会打上时间戳,方便在解码数据播放时的同步控制
2.视频播放原理
- 视频播放器播放本地文件(互联网文件)MP4/FLV 一般经历解协议、解封装、解码、音视频同步等步骤
2.1 解协议
- 将流媒体协议的数据,解析为标准的相应的封装格式数据。音视频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。
2.2 解封装
- 将输入的封装格式数据分离成音频流压缩编码数据和视频流压缩编码数据。封装格式多种多样,如MP4、MKV、RMVB、TS、FLV、AVI等。其作用是将已经压缩编码的视频数据和音频数据按照特定格式组合在一起。例如,FLV格式的数据经过解封装操作后,会输出H.264编码的视频码流和AAC编码的音频码流。
2.3 解码
- 将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
2.4 音视频同步
- 根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将这些数据送至系统的显卡和声卡以供播放。
2.5 播放
- 视频由一系列连续的画面(帧)组成,主要分为I帧、P帧和B帧。I帧是独立的完整画面,P帧依赖于前面的I帧或P帧进行编码,而B帧则依赖前后帧进行双向预测编码。这些帧的分类处理有助于大幅压缩视频大小。
说明
- 整个视频播放过程需要软件或硬件支持,包括解码器、播放器和其他相关组件。
3.视频基础
3.1 RGB解析
-
数字图像用RGB格式表示
红、绿、蓝每个RGB分量采用8bit(256)表示颜色的总数为
RGB24格式 (2的8次方)
256*256*256 = 16,777,216
RGB30格式(2的10次方)
1024*1024*1024 = 10,737,441,824 -
例如
每个像素用8bit表示RGB方式对于一幅图像,一般使用整数表示方法来进行描述,
比如计算一张的 RGB_888图像的大小,可采用如下方式:每帧数据大小
1280×720 * 3 = 2.637 MB,4分钟就达到了15G的容量。
假如是一部90分钟的电影,每秒25帧,则一部电影:2.637MB*90分钟*60秒*25FPS= 347.651GB
3.2 YUV解析
-
主要的用途用于视频信号的压缩、传输和存储,向后相容黑白电视
其中“Y”表示明亮度(Luminance或Luma),也称灰阶值; “U”和“V”表示的则是色度(Chrominance或Chroma)
作用是描述影响色彩及饱和度,用于指定像素的颜色 -
YUV主要分为两大类(planar and packed)
- 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
- 对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。
◼ Libyuv,Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。
YUV444 packed格式
YUV444 planar格式
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量
YUV420p格式 是四个Y对应一组UV(竖直)分量
YUV420sp格式 是四个Y对应一组UV(水平)分量
详细YUV介绍:
3.3 RGB与YUV420数据大小比较
- 相对于RGB,使用YUV420P的格式表示的数据量大小
YUV420 : width x height
Y = width x height
U = V = width x height x 1/4
总的存储大小: width x height x 3/2
- 计算一帧1280x720的视频帧
1280*720*1+1280*720*0.5 = 1.318MB
如果是fps(1s的视频帧数)是25,按照一般的电影的时长90分钟计算,那么使用YUV420的数据格式来表示,其大小数据量就是
1.318MB \* 25fps\* 90分钟\*60s = 173.76GB
- 如果使用RGB的数据格式表示,其大小数据量就是
RGB888 计算一帧1280x720的视频帧
1280 * 720 * 3 = 2.637MB
如果是fps(1s的视频帧数)是25,按照一般的电影的时长90分钟计算,那么使用RGB888的数据格式来表示,其大小数据量就是
2.637MB \* 25fps\* 90分钟\*60s = 347.651GB
由上得出结论使用YUV420相比RGB888大小占用减少一半
3.3.1 扩展
- 视频解码失败后显示绿色的原因
- YUV和RGB之间的转换
YUV420sp转RGB
R = Y + 1.402(V-128)
G = Y - 0.344136(U-128)-0.714136(V-128)
B = Y + 1.772(U-128)
因为解码失败的情况下YUV分量都是0的值,根据公式代入可知:
R = 0 + 1.402 *(0-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, B=0
查看颜色表:rgb(0,135,0) 只有G分量有值,因此绿色
3.4 数字图像格式转换
数字图像的格式转换,以H264直播为例:
3.4.1 视频的主要概念
-
视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。
-
视频帧率:fps,通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,给人的视觉就越流畅。
举例:
25fps的视频,解码一帧图像出来需要40ms去刷新到屏幕上面显示,而120hz的视频需要8.33ms将图像送到屏幕显示出来,因此高刷率的显示器播放蓝光视频更加清晰,画质更好
- 视频分辨率:是指视频在一定区域内包含的像素点的数量,分辨率就是我们常说的640x480分辨率、1920x1080分辨率,分辨率影响视频图像的大小。
3.4.2 IPB帧的概念
- I 帧(Intra coded frames):I帧不需要参考其他画面而生成,解码时仅靠自己就重构完整图像;
➢ I帧图像采用帧内编码方式;
➢ I帧所占数据的信息量比较大;
➢ I帧图像是周期性出现在图像序列中的,出现频率可由编码器选择;
➢ I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
➢ I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
➢ I帧不需要考虑运动矢量;
- P 帧(Predicted frames):根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据,同时利用了空间和时间上的相关性。
➢ P帧属于前向预测的帧间编码。它需要参考前面最靠近它的I帧或P帧 来解码。 (多个参考帧的时候,遇到过11个参考帧)
- B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测, 可以大大提高压缩倍数。
原理图:
以上解码顺序按照:
I帧->B帧->P帧
显示顺序按照:
I帧->P帧->B帧
DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。当视频流中没有B帧时,通常DTS和PTS的顺序是一致的,但存在B帧的时候两者的顺序就会不一致
需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。
GOP(Group of Picture)MPEG所使用的一种视频压缩技术
举例说明:
在视频采集的时候是录制一帧就编码一帧发送一帧的,在编码的时候会生成 PTS,这里需要特别注意的是 frame(帧)的编码方式,
在通常的场景中,编解码器编码一个 I 帧,然后向后跳过几个帧,用编码 I 帧作为基准帧对一个未来 P 帧进行编码,然后跳回到 I 帧之后的下一个帧。编码的 I 帧和 P 帧之间的帧被编码为 B 帧。
之后,编码器会再次跳过几个帧,使用第一个 P 帧作为基准帧编码另外一个 P 帧,然后再次跳回,用 B 帧填充显示序列中的空隙。这个过程不断继续,每 12 到 15 个 P 帧和 B 帧内插入一个新的 I 帧。
P 帧由前一个 I 帧或 P 帧图像来预测,而 B 帧由前后的两个 P 帧或一个 I 帧和一个 P 帧来预测,因而编解码和帧的显示顺序有所不同,如下所示:
- 假设编码器采集到的帧如下
I B B P B B P
- 显示顺序(PTS)
1 2 3 4 5 6 7
- 编码器的编码顺序是:
1 4 2 3 7 5 6
- 推流顺序也是按照编码顺序去推的,即
I P B B P B B
- 那么接收端收到的视频流顺序也就是
I P B B P B B
解码按照一帧一帧的去解,接收到一帧解码一帧,由于编码已经按照I、B、P帧的顺序编好了,接收到数据直接解码:
解码顺序:
I P B B P B B
DTS:1 2 3 4 5 6 7
PTS:1 4 2 3 7 5 6
可以看到解码出来对应的 PTS 不是顺序的,为了正确显示视频流,这时候我们就必须按照 PTS重新调整解码后的 frame(帧),即
I B B P B B P
DTS:1 3 4 2 6 7 5
PTS:1 2 3 4 5 6 7
另外,并不是一定要使用B帧。在实时互动直播系统中,很少使用B帧。主要的原因是压缩和解码B帧时,由于要双向参考,所以它需要缓冲更多的数据,且使用的CPU也会更高。由于实时性的要求,所以一般不使用它。不过对于播放器来说,遇到带有B帧的H264数据是常有的事儿。
在没有B帧的情况下,存放帧的顺序和显示帧的顺序就是一样的,PTS和DTS的值也是一样的。
3.4.3 常用视频压缩算法
MPEG2 MPEG阵营
H264 MPEG阵营
H265 MPEG阵营
AVS 中国阵营
VP8 Google阵营
VP9 Google阵营
4 音频基础
4.1 数字声音的表示
现实中我们听到的声音是连续波的,但是在计算机中只能通过采样来复原波形。
假设常用的采样频率44100,采样深度 16bit,2通道(声道),采集4分钟的数据44100*16*2*4*60= 338688000bit
338688000/8/1024/1024 = 40M字节,没有经过压缩的音频数据叫PCM数据
4.2 主要的音频概念
- 采样频率:每秒钟采样的点的个数。常用的采样频率有:
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:高质量音频
码率越大,压缩效率越低,音质越好,压缩后数据越大。
码率 = 音频文件大小/时长
- 音频帧实际上就是把一小段时间的音频采样数据打包起来,如每20ms的音频采样数据合并成一帧。
- 帧长
(1)可以指每帧采样数播放的时间, mp3 48k, 1152个采样点,每帧则为24ms;aac则是每帧是1024个采样点。 攒够一帧的数据才送去做编码
(2)也可以指压缩后每帧的数据长度。所以讲到帧的时候要注意他适用的场合。 每帧持续时间(秒) = 每帧采样点数 / 采样频率(HZ)
- 音频编码模式
- 交错模式:数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的左声道样本和右声道样本,再开始帧2的记录…
- 非交错模式:首先记录的是一个周期内所有帧的左声道样本,再记录所有右声道样本
常见的音频编码:
MP3,AAC ,AC3和EAC3 杜比公司的方案
解析说明:
音频概念解析
5 封装格式基础
5.1 封装格式
封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。 一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。
比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理, 同样的音视频流可以用不同容器来承载。
这里的压缩算法:
视频Video:使用了H264/AVC压缩算法
音频Audio:使用了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是目前最为流行的模式
5.2 音视频同步方式
Audio Master:同步视频到音频
Video Master:同步音频到视频
External Clock Master:同步音频和视频到外部时钟
一般情况下 Audio Master > External Clock Master > Video Master
6.开源项目
项目 | 网址 | 备注 |
---|---|---|
ffmpeg | http://ffmpeg.org | Winndows/Linux/IOS/Android |
ijkplayer | https://github.com/Bilibili/ijkplayer | IOS/Android |
7.常用分析工具
项目 | 说明 | 备注 |
---|---|---|
MediaInfo | 视频信息查看工具 | |
VLC media player | 视频流播放工具 | |
wireshark | 网络抓包工具 | |
cooledit pro2 | 音频编辑工具、PCM播放工具 | |
Elecard StreamEye Tools | 分析视频帧的工具 |