必须要掌握的音视频编码、解码基础!

一、音视频为什么要编码?

音视频编码技术在音视频领域有着举足轻重的地位,这是由于音视频原始数据量较大,在传输的过程中如果不进行编码的话,则无法进行传输。比方说,一张普通的图片的大小大概是1-2M,假设我们传输的帧率是30帧,则相当于一秒钟三十张2M的图片,那这个传输量是不得了的。所以此时我们就要引入视频编码技术进行压缩处理,目前常见的视频压缩技术有H264/H265两种压缩技术(这方面我们后面再慢慢介绍),音频编码技术是AAC,这两种压缩格式可以使得每一帧数据的大小能够压缩100-200倍,这使得传输效率大大提高。

二.音视频编码总体框图

9922e1f65d454dc365a845cbe8545da1.png

这框图就是音视频从采集到编码到推流的全流程,

2.1.第一步:采集摄像头、麦克风的数据:

编码的第一步基本上都是采集视频、音频的数据,并把采集到的数据送到对应的音视频编码器。视频数据送到H264/H265编码器,音频数据送到AAC编码器,编码处理过后分别送到视频编码队列和音频编码队列。

2.2.第二步:音视频编码数据封装:

从视频编码队列和音频编码队列拿出数据,并进行音视频的封装,所谓的音视频封装相当于把视频裸流和音频裸流合并在一起成为一个既有视频也有音频的复合流。常见的复合流有flv封装复合流、mpegts封装复合流(这两种具体的区别,在后面会说到)。

2.3.第三步:把复合流推送到对应的流媒体服务器:

把复合流拿到之后,就每一帧音频和视频数据往对应的流媒体服务器发送数据(这里要注意:不同的流媒体协议,用不同的封装格式。比方说RTMP用的是FLV格式,SRT/RTSP用的是mpegts复合流格式)。

三.什么是音视频解码:

音视频解码,顾名思义就是把已经压缩过后的音视频(视频:H264/H265,音频:AAC、MP3)数据还原成原始数据(视频原始数据:YUV,音频原始数据:PCM)的过程。

1.音视频解码的大体框图:

5a8bb246195324f82d671112d0152676.png

1.1:读取流媒体地址:并进行解封装操作 先读取音视频的流媒体地址,并把流媒体获取到的音视频进行解封装处理。所谓解封装处理就相当于把flv、mpegts等复合流分割成视频裸流(H264/H265视频流)和音频裸流(AAC音频流)。并把每个裸流分别存放到不同的队列,视频裸流存放到VideoPacket Queue,音频裸流存放到Audio Queue。(注:这里的队列名称都是自己命名的)

1.2:把队列的裸流数据取出来,进行每一帧的解码操作 把视频裸流队列和音频裸流队列的数据取出来,并一帧一帧送到解码器进行视频解码和音频解码。并把解码后的数据分别进入视频解码队列和音频解码队列。

1.3:从解码队列拿数据,并进行音视频同步处理 把第二步解码队列的音视频拿出来,分别进行音视频同步的算法处理。目前的话音视频同步,基本上都是基于音频作为参考时钟,而视频基于音频的节奏进行同步操作。音视频同步处理后,音视频基本上可以做到声音和画面完全同步了。

1.4:把音视频同步过后的数据分别播放出来 经过音视频同步处理后,视频数据(YUV数据)就直接送到SDL或者drm显示出来。而音频数据(PCM)则直接送到alsa框架进行音频播放。

四.音视频解码的难点:

音视频解码总体来说还是比较难的,其中最大的一个难点就是音视频同步的算法控制。很多音视频的初学者,对音视频的节奏总是把握不好。所以经常会出现视频比音频快十几个毫秒或者音频比视频快个十几个毫秒,这都会导致音视频不同步的重要原因。关于这部分如何控制好,还需要多去看看源代码才能更好地解决。

最后:

今天的分享就到这里,更多交流,可以加作者微信进行深度交流:

6565f677a67a0de6a697573780454392.png

猜你喜欢

转载自blog.csdn.net/Dada_ping/article/details/130716941