音视频开发基础知识全解析

发表时间: 2022-01-08 21:06

音视频技术介绍

什么是音视频技术?音视频技术其实就是音频技术和视频技术的一个统称,在技术处理上,其实音频和视频是要分开处理的。

而且要注意一点,音视频从开始收集数据到最后展示都是离不开硬件设备的,所以在以后的开发过程中,要做好与硬件打交道的心理准备了。

音视频的主要处理过程:

1. 采集。比如从客户端的摄像头、麦克风和本地原始文件等,获得基础的音视频数据;

2. 预处理。在这个阶段其实就是对音视频进行修剪操作,毕竟收集到的原始数据,不一定是想要在最后呈现的效果,因此在这里可能会进行美颜、裁剪、AI识别处理、声音A3处理等;

3. 编码。在经过预处理或者没处理过的原始文件,一般都会比较大,不适合进行传输,这个时候就需要进行压缩、转码之类的操作,减少文件提交,然后再进行传输,执行编码的工具叫编码器,压缩数据的算法叫做编码格式;

4. 解码。压缩数据传输完之后,就需要解码成原始文件一样的数据才能使用,用来解码的工具就是解码器了,不过通常编码器和解码器是一块的,统称为编解码器codec;

5. 渲染与展示。接收到原始数据文件之后,就可以通过硬件或者软件进行渲染与展示了,硬件例如显示器、音响等,软件有SurfaceView;

6. 文件封装/解封装。其实从采集,音频和视频都是分开进行处理的,但是在进行传输的时候,我们需要同一套音频文件是在一块的,所以需要进行一次文件封装。存放音视频的容器叫封装容器,文件类型叫封装格式;

7. 网络协议打包。音视频文件在网络中传输的时候,一般都会有一个特定的协议,也就是流媒体协议。

网络协议会将音视频数据文件打包成协议包,通过网络协议端口发送出去,接收方接收到网络包之后,要通过网络协议解开协议包,才能获得音视频数据文件。

音视频主要参数即格式

视频参数:

1. 分辨率:视频面积大小(像素px);

2. 帧率:每秒的帧数量fps;

3. 码率:每秒的数据量bps(b = bit)。

音频参数:

1. 采样率:每秒采集的音频点数量Hz;

2. 声道数:同时采集声音的通道数量,常见有单声道和立体声道;

3. 位宽:也叫采样位宽,指保存单个声音样本点的比特位数,通常是16bit。

原始数据格式:

视频:YUV、RGB;

音频:PCM

编码格式:

视频:H.264(也叫AVG);

音频:AAC、Opus

封装格式:

视频:MP4、FLV、TS;

音频:不封装

视频帧与音频帧

视频帧就相当于一张图片,多个图片组合以极快的速度切换,就可以形成一段视频。虽说只是图片,但是视频帧有很多种类之分,后面我会进行介绍。

视频帧的类型

目前视频帧主要分为一下几种:

1. I帧即关键帧记录了一个完整的图像,可以被直接解码显示,两个I帧中间的一组帧称之为一个GOP(group of picture);

2. P帧,不记录画面,记录的是本帧与前一帧的差异,P帧不能直接解码,需要先解码前序的参考帧;

3. B帧是记录了本帧与前一个I/P帧和后一个I/P帧的差异;

4. 剩下的还有SI和SP帧,这俩是用于切换码流使用,一般不常见。

P帧和B帧主要是用来压缩视频用的,大概原理可以理解,I帧存储的是原图像,那么存储的数据量也会比较大,如果I帧出现的占比越多,那么整个视频的数据量也就越多。

这个时候P帧和B帧的出现,可以明显的减少数据量,P帧只会对比前一个P帧或者I帧的差异,并存储下来,数据量比I帧小了很多,大概压缩比有20左右,另外B帧会对比前一个I/P帧、后一个I/P帧与本帧的差异,并进行存储,因为对比了两个帧,所以B帧存储的数据量就会更小,压缩比能达到50。

在直播中,基本上不会出现B帧,因为B帧是需要解析了前后两个帧之后做对比产生的,在直播这种最求速度和画质的场景中,如果使用B帧,会因为大量解析的时间增加不少延迟,但是也不能全是I帧,I帧的数据量太大,全是I帧的话,效率也会很差,所以直播一般是用的I帧和P帧组合。

相关视频推荐

音视频开发系列-快速掌握音视频开发基础知识(视频录制原理、视频播放原理、视频基础知识、音频基础知识)_哔哩哔哩_bilibili

FFmpeg:音视频开发必需掌握的第一个开源项目_哔哩哔哩_bilibili

学习地址:【免费】
FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂

【文章福利】需要C/C++ Linux服务器架构师及音视频学习资料加群812855908(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,音视频,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)

视频清晰度

一个视频的画质与视频的码率、分辨率、压缩比、帧率、GOP长度有关。只有他们达到了最佳平衡,才能呈现最佳的画质。

比如说,分辨率,一般在我们的印象中,就是越高,画质就越清晰,这也是没毛病的,毕竟分辨率越高,画面分配到的像素点越多,细节描绘就越好,但是要注意,分辨率越高,带来的问题就是数据量越大,数据量越大,那就代表着需要的码率也就越高,只有码率高了才能保证我们视频数据的正常输出,如果码率低了,就是造成视频的卡顿,也就是我们常看见的“视频缓存中”。

不过现在很多视频软件也会做一些操作来降低码率带来的卡顿效果,比如调节压缩比,压缩比高了,数据量就小了,需要的码率也就降低了,当然牺牲的就是原视频的分辨率了。目前很多软件会自动帮你调节压缩比。

那么帧率又在其中起到了什么作用呢?玩游戏的都知道,帧率越高,游戏的流畅度就越高,帧率就是视频的刷新率,也就是一秒钟刷新的帧数,比如说帧率30fps,你就可以理解成,30幅连续动作的画一秒钟从你眼前阅过。

一般来说:30fps左右可以感觉动作已经是连贯的了;60fps体验已经可以达到逼真感;超过75fps,一般就没法察觉流畅度的提升了

帧率有显示器帧率和视频帧率之分,这一点是要注意不要混淆了。那我们这里可以探讨一下如果视频帧率与显示器帧率不同的情况下会出现什么情况。

其实视频帧率就是显卡绘制图形速度控制的,假如说你的显卡绘制速度是30fps,而显示器的帧率是60fps,显示器刷新的速度比显卡绘制速度快,这个时候显示器就只是刷新最新的那些帧,在观看体验上并不会有什么差异。

但是如果显示器的帧率是30fps,而显卡是60fps,那就问题来了,因为显卡绘制图形速度过快,而显示器刷新速度太慢,就会导致有的帧被缓存下来,当缓存区别放慢了之后,后面继续进来的数据就会把之前的数据挤走,这就导致了显示器当前帧与缓存区下一帧不是连贯的,也就会出现了“画面撕裂”。

再来说说GOP对画质的影响,前面有说过,GOP就是一个I帧与下一个I帧之间的帧组合,比如IBBPBBP...之类的,在一组GOP中,因为B和P帧只记录了差值,所以需要的数据量比I帧少很多。

所以我们可以想象,在有限的数据量里边,如果GOP长度越长,I帧所分到的数据量就能越多,I帧的质量就可以更高,I帧又是GOP的基准帧,那么整体的画质也就提升了。

但是不是GOP越长,就越好呢?回答当然是no,根据之前说的,P和B帧都是参考I帧生成的,有依赖关系,解析时间比I帧长很多,设置过多的B、P帧那就代表着在解析上面就要花费更多的时间,另外如果他们参照的I帧出现了数据问题,那么这一组GOP的数据就全部出错。由此看见,GOP也并不是越长越好。

音画同步

我们都知道,播放器在处理音视频的时候是分开进行解码渲染的,那么又如何才能达到音画同步呢?我们可以联想到我们的现实世界,我们是如何理解同步这个概念,其实同步就是指的同时发生。

那么要做到音画同步也就是说我们要给音画添加上时间戳(PTS)的概念,时间相近的音频帧和视频帧,我们就认定为是同步的两个帧,这个相近值我们可以叫他阈值,这个阈值并不是随意定义的,他有一个国际标准叫RFC-1359.

一般音视频同步的做法有三种:视频同步到音频、音频同步到视频、音视频同步的外部时钟。

通常采用视频同步到音频的方法。这是因为视频是一帧一帧播放的,而音频则是一个流式的播放形式,也就是连续不间断的形式,在处理逻辑上,处理一帧帧播放的视频会来的更加方便。音视频同步的算法如下图所示:

音画同步算法

流媒体协议

通常音视频数据体积比较大,所以在网络传输过程中都是连续不断的多媒体流量,在网络中传输音视频数据的技术叫流媒体技术,传输使用的协议就是流媒体协议。

通常使用的流媒体协议有一下几种:

1. RTMP:基于TCP七层协议,性价比高,是目前直播推流的标准使用协议;

2. HTTP-FLV:基于TCP,使用HTTP传输FLV流,分发性能强,适用于CDN分发;

3. HLS:基于TCP,被HTML5写入标准支持,延时大,但是兼容H5;

4. RTP:基于UDP四层协议,定义简单且性能好,但是需要额外的信令协议。

除了以上四种之外,有些厂商还会有自己的协议已达到特定的传输目的。

网络抖动

首先要先来熟悉一下几个衡量网络好坏的指标:

1. 丢包率:(本端接收到的数据包/对端发送的数据包) * 100%;

2. 延时:对端接收时间T1-本端发送数据时间T0,一般用RTT来评估延时,即往返延时,本端发送数据,到对端接收数据并确认接收的耗时;

3. 带宽:网口允许收发数据量的大小,单位bps,发送速率:实际收发的数据量的大小,单位bps。带宽可以理解成最大发送速率;

网络抖动就是实际发(收)的数据没有发(收),判断是否抖动就是看丢包率是否增加、 RTT是否增加、发送速率是否降低。

JitterBuffer就是为了减少网络抖动给音视频传输带来的影响而产生的,jitterBuffer是传输过程中的一个缓冲区,连接着解码器和网络协议栈。

JitterBuffer会有一的延迟音视频传输时间,将数据先缓存在缓冲区中,并且也会将之前缓存的数据发送到接收端,我就把他理解成我们在网上看电视的时候的视频缓存,这样的话,即使出现了偶尔的网络抖动,也不会影响到用户的体验。

JitterBuffer带来的好处就是:

1. 降低了网络轻微抖动打来的卡顿;

2. 平衡编解码器和网络协议栈的数据供求量;

3. 动态调整数据的收发量,在一定范围内控制数据收发平衡性。

总结

以上是我整合了一些其他大佬的资料和一些自己的理解写出的知识点,音视频技术涵盖的内容其实比较广泛的,我这里也仅仅是列出了一些基础的概念,后续的TRTC学习之旅,有机会的话,我们继续探讨一些其他的知识。