FFmpeg学习:简单介绍(零声教育课件内容)
音视频录制\播放原理
视频基础
图像表示——RGB表示
RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。
在每个通道中,每个像素采用 8 bit 表示,对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张的 RGB_888 图像的大小,可采用如下方式:\(1280×720 \* 3 = 2.637 MB\),4分钟就达到了15G的容量。假如是一部90分钟的电影,每秒25帧,则一部电影为 \(2.637MB\* 90分钟 \*60秒 \*25FPS= 347.651GB\)
图像表示——YUV表示
用途:主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视。
其中“Y”表示明亮度(Luminance或Luma),也称灰阶值;
“U”和“V”表示的则是色度(Chrominance或Chroma)
作用是描述影像色彩及饱和度,用于指定像素的颜色。
YUV格式:有两大类:planar和packed。
-
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存
储所有像素点的U,随后是所有像素点的V。 -
对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。
-
Libyuv,Google开源的实现各种YUV与RGB之间相互转换、
旋转、缩放的库。 -
YUV存在多种格式,比如YUV420p,YUV420sp等,不同的YUV格式的数据在存储时的排列顺序是不一样的,在开发的过程中必须非常注意,否则画面会显示不正常。比如花屏,绿屏等现象
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
更多介绍:
- http://blog.51cto.com/7335580/2059670
- http://blog.51cto.com/cto521/1944224
- https://blog.csdn.net/mandagod/article/details/78605586?locationNum=7&fps=1
相较于RGB,我们可以计算一帧为1280×720的视频帧,用YUV420P的格式来表示,其数据量的大小如下: 4 2 -> 1 + 0.5 = 1.5,1280 * 720 * 1 + 1280 * 720 * 0.5 = 1.318MB
如果fps(1秒的视频帧数目)是25,按照一般电影的长度90分钟来计算,那么这部电影用YUV420P的数据格式来表示的话,其数据量的大小就是:
1.318MB * 25fps * 90min * 60s = 173.76GB
图像格式转换
以 H264 直播为例
视频基本概念
- 视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。
- 视频帧率:fps,通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,给人的视觉就越流畅。
- 视频分辨率:分辨率就是我们常说的640x480分辨率、1920x1080分辨率,分辨率影响视频图像的大小。
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 帧图像采用双向时间预测,可以大大提高压缩倍数。
常用压缩算法
- MPEG2 MPEG阵营
- H264 MPEG阵营
- H265 MPEG阵营
- AVS 中国阵营
- VP8 Google阵营
- VP9 Google阵营
音频基础
主要概念
采样频率:每秒钟采样的点的个数。常用的采样频率有:
- 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:高质量音频
码率越大,压缩效率越低,音质越好,压缩后数据越大。
码率 = 音频文件大小/时长。
帧:音频的帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一张图像。
帧长:
(1)可以指每帧采样数播放的时间, mp3 48k, 1152个采样点,每帧则为 24ms;aac则是每帧是1024个采样点。 攒够一帧的数据才送去做编码
(2)也可以指压缩后每帧的数据长度。所以讲到帧的时候要注意他适用的场合。
每帧持续时间(秒) = 每帧采样点数 / 采样频率(HZ)
交错模式:数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的左声道样本和右声道样本,再开始帧2的记录...
非交错模式:首先记录的是一个周期内所有帧的左声道样本,再记录所有右声道样本
常用音频编码格式
- MP3
- AAC
- AC3和EAC3 杜比公司的方案
封装格式基础
概念
封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。
比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理,同样的音视频流可以用不同容器来承载。
常用视频封装格式
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是最为流行的模式
音视频同步基础
- DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
- PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但存在B帧的时候两者的顺序就不一致了。
音视频同步方式
- Audio Master:同步视频到音频
- Video Master:同步音频到视频
- External Clock Master:同步音频和视频到外部时钟。
一般情况下 Audio Master > External Clock Master > Video Master