连麦互动直播中混屏技术设计
目录
一. 混屏原理
二. 实现混屏关键技术
1. 并发解码
2. 图像合成
3. 视频同步
4. 编码输出
5. 内存管理
三. 具体实现流程
1、混屏流程
2、混屏算法
四. 音视频同步
五. 总结
参考文献:
本内容全原创,因作者才疏学浅,偶有纰漏,望不吝指出。本内容由灵声讯音频-语音算法实验室整理创作,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)
一. 混屏原理
根据当前混屏或图像合成的研究成果,以及对市场上成型的混屏产品的分析,采用基于视频帧合成的实时流混屏方案。该方案需用高度并发解码方式,对RTPP双线交互的两路视频流进行实时解码成为视频帧序列;并通过将两个视频帧中的YUV图像合成,生成新视频帧,再对新视频帧进行编码,按要求输出目标格式的实时视频流。该方案的系统架构如图1所示:
图1 实时混屏系统框图
解码模块包括两个解码器,一个解码器负责对一个实时视频流进行解码,获得数据帧后,由预处理模块对视频帧进行以下处理。
首先,根据目标输出视频的像素比例,计算该视频画面在目标画面所占的实际大小,对视频帧进行缩放操作,在此缩放视频帧,可以减少后续处理的数据量,而不影响转换后的视频质量。然后,检查图像的色彩空间格式,如果不是YUV格式,统一为YUV格式。最后,将处理好的视频帧从队列尾部加入到待处理的视频帧队列中。
视频合成模块,访问各个编码器输出的待处理的视频帧队列,从队列头部取出视频帧,进行合并。在合并过程中,为保证视频同步,以其中一个视频流为基准,对其他视频流的数据帧采用插帧或丢弃,保证所有数据帧的时间戳一致。解码模块和视频合成模块对视频帧队列分别进行处理,解码模块输出数据帧插入到队列尾,而视频合成模块从视频帧队列头开始处理,将解码和编码的耦合度降到最低,解码与编码可以同时进行。
编码器对视频合成模块输出的视频帧序列进行编码,转换生成混屏后的实时视频流。
二. 实现混屏关键技术
1. 并发解码
实时视频流混屏处理多路实时视频流输入,并输出实时视频流。解码处理的数据量大,实时性要求高,对服务器的解码能力提出很高要求。高度并发解码,充分利用多核CPU计算能力是实现实时视频流混屏的关键。为提高并发度,并发解码至少包括两级并发,一级是两个实时流解码器的并发解码,二级是解码器Frame级别的并发解码。
两个解码器分别对不同的视频源进行处理,并将分别独立输出数据帧,以队列的方式保存,供后续模块调用。解码器之间相互独立,不存在制约关系,可并发处理,提高CPU利用率。解码器Frame级别的并发,解码器采用线程池方式进行解码。在解码器初始化时,根据服务器CPU核数,初始化相应数目的解码线程。解码线程接收输入数据,并对数据进行解码。外部程序通过解码器提供的调用入口,进入解码器的主线程。
2. 图像合成
将两个视频混屏,可通过图像合成的方式,将两个实时流的数据帧图像合成新图像,将合成后的视频帧作为输入进行编码得到实时视频流输出。两个数据帧的图像合成必须采用统一的图像格式。图像数据在存储中的存储格式主要包括RGB和YUV。YUV格式所需存储空间比RGB格式存储空间小,因此YUV格式主要用于多媒体数据传输。高清实时视频流多采用H.264编码方式,其采用的色彩空间是YUV。在合成过程中,如发现视频源的图像采用RGB方式,则需要将其转换成YUV才可合成。
RGB图像和YUV图像可相互转换,从RGB到YUV的转换公式见公式(1)。
Y=0.30R+0.59G+0.11B
U=0.493(B-Y) (1)
V=0.877(R-Y)
另外,YUV格式也存在多种不同的采样比。在实际应用中,为减少运算量,可选择使用视频源中最普遍使用的格式,而将其他格式的图像进行转换,形成统一格式。
将两个YUV图像合成一个YUV图像,可根据各个图像排列的位置,对图像的三个分量重新进行排列组合成新图像。以Planar格式为例,将两个YUV图像合成一个YUV图像,可将YUV三个通道各自分开处理,对每个通道的分量,按照每行分量的位置从左到右排列,各行从上到下排列。
3. 视频同步
图像合成组成新的视频需解决两路视频间的同步问题。由于两路高清视频流的来源不一致,解码后获得包含图像的数据帧的帧率不一致,为确保合成后视频的质量,必须将多路视频的输出图像进行同步处理。同步方法如下。
选取一个实时视频流的输出数据帧作为基准序列,在单位时间内,对其他实时视频流解码后获得的数据帧序列,通过插帧或丢弃的方式,将视频帧的个数与基准源保持一致,以基准序列的时间戳作为合成后数据帧序列的时间戳。为提高视频质量,在对数据帧进行插帧或丢弃时,可根据对视频对象做真实运动的估值结果进行处理。
4. 编码输出
将合并后的数据帧序列作为原始数据,输入到编码器中。编码器根据目标输出设置的参数,生成实时流,将实时流推到流媒体服务器中。客户端只需要访问CDN服务器即可播放合成后的视频。图像合成只考虑视频处理。
5. 内存管理
数据帧的内存管理机制对数据帧提供创建、销毁、引用、撤销引用、引用迁移等操作,并增加数据区的引用计数器。在引用、撤销引用、引用迁移时,不重新申请数据区,而是建立、修改或撤销对数据区的引用关系,保持数据区指针在数据帧对象中,并修改数据区的引用计数器。当数据帧Buffer被创建时,计数初始化为1。当该Buffer被数据帧引用时,计数+1,当数据帧撤销引用时,计数-1。
每数据帧撤销引用时,检查计数器数值,只有当发现计数器被清零时,才释放该数据区。通过采用引用计数器的机制,有效防止内存泄露,并大大减少重复的内存申请和数据复制操作,提高处理性能。
三. 具体实现流程
1、混屏流程
⑴ 线程1和2相同流程是取得解码完的数据。
⑵ 不做帧内存管理,即时混屏。
⑶虚线左边为上层,右边为下层。
2、混屏算法
⑴ 缩放为按比例进行下采样得到。
⑵ 混屏为对内存数据改写。
其中, LAST_WIDTH 为360,LAST_HEIGHT为480,target_width为LAST_WIDTH/3,target_height为LAST_HEIGHT/3;
四. 音视频同步
音视频同步是实时流媒体互动最基本的需求。从技术上来说,解决音视频同步问题的最佳方案就是时间戳:首先选择一个参考时钟(要求参考时钟上的时间是线性递增的);生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳(一般包括开始时间和结束时间);在播放时,读取数据块上的时间戳,同时参考当前参考时钟上的时间来安排播放(如果数据块的开始时间大于当前参考时钟上的时间,则不急于播放该数据块,直到参考时钟达到数据块的开始时间;如果数据块的开始时间小于当前参考时钟上的时间,则“尽快”播放这块数据或者索性将这块数据“丢弃”,以使播放进度追上参考时钟)。
可见,避免音视频不同步现象有两个关键:一是在生成数据流时要打上正确的时间戳。如果数据块上打的时间戳本身就有问题,那么播放时再怎么调整也于事无补。假如,视频流内容是从0s开始的,假设10s时有人开始说话,要求配上音频流,那么音频流的起始时间应该是10s,如果时间戳从0s或其它时间开始打,则这个混合的音视频流在时间同步上本身就出了问题。打时间戳时,视频流和音频流都是参考参考时钟的时间,而数据流之间不会发生参考关系;也就是说,视频流和音频流是通过一个中立的第三方(也就是参考时钟)来实现同步的。二是在播放时基于时间戳对数据流的控制,也就是对数据块早到或晚到采取不同的处理方法。
五. 总结
以上基于视频帧合成的实时流视频混屏的方法,两个解码器间互不干扰,为高度并发解码提供可能;并采用视频帧队列管理的方式,使得解码和编码的耦合降到最低,解码与编码可以同时进行。高度并发使服务器的多核CPU运算能力得到充分利用,仅依靠软件解码的方式就能实现两个高清视频的混屏。混屏处理后,以实时视频流的方式输出,客户端只需接收视频流进行播放即可,对客户端的配置要求低。
参考文献:
[1] 黄东君,陈松乔.基于源根组播的多点视频会议系统模型及其实现.电子学报,2005(1).
[2] 刘峰.视频图像编码技术及国际标准.北京邮电大学出版社,2005(7).
[3] 肖永豪,余英林.基于视频对象的自适应去帧/插帧视频处理.华南理工大学学报(自然科学版),2003(8).
[4] 刘晓玲,张涛. 基于帧图像合成的实时视频混屏关键技术研究.电信技术,2014(4).
本内容由灵声讯音频-语音算法实验室整理,转载和使用请与“灵声讯”联系,联系方式:音频/识别/合成算法QQ群(696554058)