1、视频
1.1 什么是视频
视频(video) 泛指一系列静态影像以电信号的方式加以捕捉、记录、处理、存储、传送与重现的各种技术。
连续的图像变化每秒超过 24桢(frame) 画面以上时,根据视觉暂留原理,人言无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,主演通过连续的画面叫做视频。
视频技术最早是为了电视系统而发展的,但是现在已经发展为各种不同的格式以利于消费者将视频记录下来。
网络技术的发达也促使视频的记录片段以串流媒体的形式存在于因特网上并可被电脑接收与播放。
视频与电影属于不同的技术,后者是利用照相技术将动态的影像捕捉为一系列的静态照片。
常见的视频格式:avi、mov、mp4、wmv、flv、mkv …
1.2 视频的主要概念
- 视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码流率越大,说明单位时间内取样率越大,数据流精度就越高。
- 视频帧率:fps,通常说一个视频的 25 帧,指的就是这个视频帧率,即 1秒中会显示 25 帧。帧率越高,给人的视觉就越流畅。
- 视频分辨率:分辨率就是我们常说的 640480 分辨率、19201080 分辨率,分辨率影响视频图像的大小。
- 容器/文件(Container/File):即特点格式的多媒体文件,比如 mp4、flv、mkv 等。
- 媒流体(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字母数据,可以使压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。
- 数据帧/数据包(Frame/packet):通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。
一般情况下:Frame 对于压缩前的数据,Packet 对应压缩后的数据。 - 编解码器(Codec):以帧为单位实现压缩数据和原始数据之间的相互转换的。
- 复用(mux):把不同的流按照某种容器的规则放入容器中,这种行为叫做复用(mux)。
- 解复用(demux):把不同的流从某种容器中解析出来,这种行为叫做解复用。
1.3 桢
1.3.1 何为桢
桢,是视频的一个基本概念,表示一张画面,如翻页动画书中的一页,就是一帧。一个视频就是由许多的桢组成的
1.3.2 帧的分类
帧有三种类型:I 帧、P 帧、B 帧
- I 帧(Intra coded frames):不需要参考其他画面而生成,解码时进靠自己就重构完整图像。
- I 帧图像采用帧内编码方式;
- I 帧所占数据的信息量比较大;
- l 图像是周期性出现在图像序列中的,出现频率可由编码器选择;
- I 帧是 P 帧和 B 帧的参考帧(其质量直接影响到同组中以后各帧的质量);
- I 帧是帧组 GOP 的基础帧(第一帧),在一组中只有一个I帧;
- I 帧不需要考虑运动矢量;
- P 帧(Predicted frames):根据本帧与相邻的前一帧(I 帧或 P 帧)的不通电来压缩本帧数据,同时利用了空间和时间上相关性。
- P 帧属于前向预测的帧简编码。它需要参考前面最靠近它的 I帧或 P帧来解码(多个参考帧的时候,遇到11个参考帧)
- B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测可以大大提高压缩倍数。
1.3.3 帧率
桢率,即单位时间内桢的数量,单位为:桢/秒 或 fps (frames per second)。如动画书中,一秒内包含多少张图片,图片越多,画面越顺滑,过度越自然。
桢率一般有下面几个典型值:
- 24/25 fps :1秒 24/25 桢,一般的电影频率;
- 30/60 fps :1秒 30/60 桢,游戏的帧率,30桢可以接收,60桢会感觉更加流畅逼真。
85 fps 以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大的意义。
1.4 彩色
下面我们只讲常用到的两种色彩空间。
- RGB:RGB 的颜色模式应该是我们最熟悉的一种,在现在的电子设备中应用广泛。通过 RGB 三种基础色,可以混合出所有的颜色;
- YUV:这里着重讲一下 YUV,这种色彩空间并不是我们熟悉的。这是一种亮度与色度分离的色彩格式。
1.4.1 何为 YUV
用途:主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视。
早期的电视都是黑白的,即只有亮度值,即 Y。有了彩色电视以后,加入了UV 两种色度,形成现在的 YUV ,也叫 YCbCr。
- Y:亮度(Luminance 或 Luma),也称灰度值。除了表示亮度信号外,还含有较多的绿色通道量;
- U:蓝色通道与亮度的差值;
- V:红色通道与亮度的差值(U 和 V 表示的则是色度(Chrominance 或 Chroma))。
作用是描述影响色彩及饱和度,用于指定像素的颜色。
1.4.2 采用 YUV 有什么优势
人眼对亮度敏感,对色度不敏感,因此可以减少 UV 的数据量,人眼无法感知出来,这样可以通过压缩 UV 的分辨率,在不影响观感的前提下,减小视频的体积。
1.4.3 YUV 分类
YUV 格式有两大类 planar 和 packed。
- planar :对于 planar 的YUV 格式,先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。
- packed:对于 packed 的YUV 格式,每个像素点的 Y,U,V 是连续交 * 存储的。
注意:YUV 存在多种格式,比如 YUV420p,YUV420sp等,不同的 YUV 格式的数据在存储时的排列顺序是不一样的,在开发的过程中必须非常注意,否则画面会显示不正常。比如花屏,绿屏等现象。
1.4.4 RGB 和 YUV 的换算
下图即为 RGB 和 YUV 之间的换算:
(Libyuv,Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放的库)
2、音频
2.1 何为音频
音频数据的承载方式最常用的就是脉冲编码调制,即 PCM。(没有经过压缩的音频数据我们交 PCM 数据)
在自然界中,声音是连续不断的,是一种模式信号,那么怎样才能把声音保存下来呢?
那就是把声音数字化,即转化为数字信号(现实中我们听到的声音是连续波的,但是在计算机中只能通过采样来复原波形)。
我们知道声音是一种波,有自己的振幅和频率,那么保存声音就要保存声音在各个时间点上的振幅。而数字信号并不能连续保存所有时间点的振幅,事实上,把不需要保存连续的信号,就可以还原到人耳可接受的声音。
根据奈奎斯特采样定理:为例不失真地恢复模拟信号,采用频率应该不小于模拟信号频谱中最高频率的2倍。
根据以上分析,PCM 的采样步骤分为以下几个步骤:
模拟信号 -> 采样 -> 量化 -> 编码 -> 数字信号
2.2 音频的主要概念
-
采样频率:每秒钟采样的点的个数。常用的采样频率有:
- 22000 (22kHz) : 无线播。
- 44100(44.1kHz) : CD音质数字电视,DVD。
- 48000(48kHz) : 96000 (96kHz) : 蓝光,高清DVD。
- 192000(192kHz): 蓝光,高清DVD。
前面提到,采样率要大于原声波频率的2倍,人耳能听到的最高频率为20kHZ,所以为例满足人耳的听觉要求,采样率至少为40kHZ,通常为 44.1kHZ,更高的通常为48kHZ。
注意:人耳听觉频率范围 [20HZ,20kHZ]
-
采样精度 (采样深度):每个“样本点”的大常用的大小为8bit,16bit,24bit。
-
通道数:单声道,双声道,四声道,5.1声道。
-
比特率:每秒传输的 bit 数,单位为:bps(Bit Per Second)。
(间接衡量声音质量的一个标准。)
没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。 -
码率:压缩后的音频数据的比特率。常见的码率:
- 96kbps: FM质量
- 128-160kbps:一般质量音频。
- 192kbps:CD质量。
- 256-320Kbps:高质量音频
码率越大,压缩效率越低,音质越好,压缩后数据越大。
码率 = 音频文件大小/时长。
-
帧:音频的帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一张图像。
- 帧长:
- 可以指每帧采样数播放的时间,mp3 48k, 1152个采样点,每帧则为24ms; aac则是每是1024个采样点。攒够一的数据才送去做编码。
- 也可以指压缩后每的数据长度。所以讲到帧的时候要注意他适用的场合。
每帧持续时间(秒) = 每采样点数 / 采样频率 (HZ)
- 帧长:
-
采样位数:涉及到上面提到的振幅量化。波形振幅在模拟信号上也是连续的样本值,而在数字信号中,信号一般时不连续的,所以模拟信号量化以后,采样器会采用一个固定的位数来记录这些振幅,通常由8位、16位、32位。
注意:位数越多,记录的值越准确,还原度越高,但是占用的硬盘空间越大。
2.3 常用音频编码
MP3、AAC、AC3 和 EAC3 杜比公司的方案
3、封装格式
3.1 什么是封装格式
封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。
比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理同样的音视频流可以用不同容器来承载。
3.2 压缩算法
这里的压缩算法:
视频Video:使用了H264/AVC压缩算法
音频Audio:使用了AAC压缩算法
封装则使用MP4封装格式
3.3 常见的视频封装格式
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是最为流行的模式
4、音视频同步
4.1 音视频同步概念
-
DTS (Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
-
PTS (Presentation Time Stamp): 即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但存在B帧的时候两者的顺序就不一致了。
4.2 同步方式
- Audio Master:同步视频到音频
- Video Master:同步音频到视频
- External Clock Master:同步音频和视频到外部时钟。
般情况下 Audio Master > External Clock Master > Video Master
5、流
为什么音视频需要有个流的概念?
因为操作系统对文件的操作,就是基于流的抽象。一般来说,文件很大,我们很难一下子全部读取进内存,只能一点一点地读。同样,音频和视频也是基于文件存储,也只能一点一点地读取。所以我们就需要流的概念。
为了更好地理解流,这里做个比喻。有个大冰箱,我们需要对里面的水进行处理,但手里只有一个水桶,通过大冰箱的水龙头控制水的流动,一桶一桶地进行处理。
文件流水流共同点:视频文件大冰箱不能全部一次性处理文件 API ,水龙头控制每次处理的数量缓冲区 Buffer 水桶当前能够处理的数量。
6、FFmpeg 的基本概念
6.1 什么是 FFmpeg
- FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源软件。采样 LGPL 或 GPL 许可证,提供了录制、转换以及流花音视频的完整解决方案。它包含了非常先进的音视频编解码库 libavcodec;
- FFmpeg一个领先的多媒体框架,具备解码,编码,转码,复用,解复用,流式传输,滤镜和播放等能力;
- 它包含可供应用程序使用的libavcodec,libavutil,libavformat,libavfilter,libavdevice,libswscale和libswresample。 以及最终用户可用于转码和播放的ffmpeg,ffplay和ffprobe。
6.2 播放的框架
6.3 获取 FFmepg 源码包
FFmepg 官方网站:ffmpeg.org/
在官网找到需要的版本,我选用的是 FFmpeg 3.4.4 “Cantor” 版本,因为最新版本没有ffserver。然后在Linux 执行下载、解压命令:
wget http://www.ffmpeg.org/releases/ffmpeg-3.4.4.tar.gz
tar -zxvf ffmpeg-3.4.4.tar.gz
6.4 配置与编译 FFmepg
解压后进入到 ffmpeg 目录开始配置 ffmpeg ,执行下面命令:
./configure --enable-ffplay --enable-ffserver
此时可能会出现错误信息打印:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.
这是由于 asm版本是旧的或者没有asm,因此需要安装或者更新,执行如下命令:
sudo apt-get install yasm
分析:yasm 是汇编编译器,ffmpeg 为了提高效率使用了汇编指令,如 MMX 和 SSE 等。所以系统中未安装 yasm 时,就会报上面的错误。
6.5 编译并安装
执行下面命令,编译并安装 FFmpeg
make;make install // root 权限,要不然安装会失败
查看是否安装成功
到这里,我们的 FFmpeg 基本就可以使用了。
更多知识,我们下一篇博客再见,下篇见。