张弛,沈剑锋,姜忠鼎
随着计算机硬件的发展,高性能的图形显示系统在诸如数字影院,商业会展,互动娱乐等领域中应用逐渐广泛,对此类系统的需求主要为超大的显示尺寸,超高的显示分辨率与强烈的沉浸感[1]。由于 LCD显示屏具有物理边框,在多显示拼接时难以做到无缝拼接,因此利用计算机集群连接多台投影仪,并对画面进行几何校正与颜色校正实现无缝拼接,成为主流的图形显示系统的画面显示方案[2-3]。例如美国普林斯顿大学研发的 Display Wall[4-5],芝加哥伊利诺斯大学EVL实验室研发的SAGE系统[6-7],及瑞典Dataton公司开发的 Watchout系统[8]等等,国内浙江大学与复旦大学也有多投影拼接的图形显示系统[9-13]。由于单台计算机的性能有限,利用多台计算机组成集群提供图形渲染或显示服务,是此类系统普遍采用的架构。
在基于多投影的图形显示系统中,视频播放作为核心功能之一得到广泛应用[17],全屏展示高质量高分辨率的立体视频,能够为观众营造优秀的视觉体验与强烈的沉浸感。视频资源质量的快速提升使得此类系统需要在集群中进行视频播放,而支持主动立体的投影仪的逐渐普及要求此类系统应当能够在集群中利用主动立体显示技术。在应用主动立体显示时,如何对视频播放进行有效地同步是系统的关键点之一。系统的另一个关键点在于高效的视频解码,系统进行视频播放时需要考虑能否将视频资源编码进单一的视频文件中,并且解码单个高分辨率视频的速率可能无法支持视频流畅播放。
对于集群的同步,文献[14]在进行视频播放时将视频流进行实时网络传输与分布式解码,因此并未针对视频播放提出集群同步方案;文献[16]提出了两种基于网络的,面向多组应用程序的同步方案,可以分开进行数据同步与刷新同步,然而其数据同步机制未对视频播放进行速率控制,并且并未考虑主动立体显示时的集群同步。对于视频播放,文献[5]和文献[14]利用网络传送视频流进行分布式解码,因而对网络资源占用较多;文献[12]和文献[17]分别面向交互式应用与虚拟现实应用,采用分层与分块的策略提升超高分辨率画面的处理效率,然而对于视频播放系统而言,分层策略并没有必要;本项目组的已有研究成果[13]实现了集群中的视频同步播放,然而其集群同步机制不支持主动立体显示技术,并且只支持单个视频文件的播放。
为了实现集群环境下利用主动立体技术进行视频播放,本文提出了一种解决方案。其中,对于集群的同步,我们利用网络通信与硬件同步技术结合,在各个节点之间实现数据同步,刷新同步,并利用帧锁相支持集群主动立体显示;对于视频播放,我们利用组合视频对象对多个视频文件进行并发解码与画面还原。并通过实验验证了解决方案的的有效性与可行性。
在利用多投影的图形显示系统中进行偏振立体显示时,系统利用两组安装了偏振滤光片的投影仪在投影幕上重叠投射左眼与右眼画面,观众佩戴偏振眼镜即可看到立体画面。目前偏振立体技术已经在国内的数字影院中普及,然而偏振立体技术要求使用两组投影仪,并且具有画面亮度低的缺陷,影响观看体验。主动立体技术利用高频率刷新的显示器与快门眼镜,交替为左眼与右眼显示画面从而营造立体感,其原理如图1所示:
图1 主动立体显示原理
虽然这种技术要求专业显卡与专门的显示设备,但具有优秀的画面效果,现今很多投影仪已经对其提供支持,该技术在商业展览展示与数字娱乐领域的应用也逐渐广泛。
应用主动立体显示要求系统利用具备四缓冲立体显示功能的显卡。四缓冲立体即在传统的双缓冲显示基础上,将前台缓冲与后台缓冲分别扩展为左眼与右眼两个缓冲,使得应用程序可以为双眼分别渲染画面[15]。
由于主动立体显示技术要求显示设备交替显示左右眼画面,集群中的多台显示设备的信号输出必须进行同步。另外,在集群中进行视频播放所需要的同步与其他类型应用的同步也有不同。本文的第2节介绍了本文解决方案中的集群同步机制,显示节点的同步模块采用服务器/客户端架构,结合了网络方式与硬件方式实现视频播放的数据同步与刷新同步,以及显卡输出信号的同步。
在利用多投影集群进行视频播放时,必须考虑的问题是单个显示节点展示的画面能否被编码至单个视频文件中,以及单个视频文件的解码效率是否支持其流畅播放。本文的第3节介绍了本文解决方案中的视频解码方式,通过构建抽象的组合视频对象,使系统能够播放编码为多个视频文件的超高分辨率视频资源,通过并发解码,提升视频的解码效率。
在本文的解决方案中,集群中具有单个主节点和多个从节点,主从节点各自的结构如图2所示:
图2 主节点与从节点各自的模块
其中各个模块的作用如下:
组合视频模块负责对组合视频进行并发解码与视频帧对齐,将视频帧进行组合,并渲染至纹理中。
画面渲染模块将组合视频生成的纹理进行投影校正,并进行缓冲交换以显示画面。
同步客户端模块与同步服务器进行基于UDP协议的网络通信,为组合视频的画面组合提供数据同步功能与刷新同步功能。
同步服务器模块仅在主节点运行,在后台运行多个线程,每个线程分别负责显示集群的启动同步,终止同步,数据同步和刷新同步。
各个模块之间的协作关系,如图3所示:
图3 显示节点模块之间的协作
每个显示节点在初始化时,通过配置文件判断自身是否为主节点,来决定是否启动同步服务器,并结合配置文件信息与实际硬件状况决定是否启用硬件同步,如图4所示:
图4 显示节点的核心逻辑
画面渲染模块在显示节点的画面更新循环中进行画面的投影校正与更新,画面更新循环如图5所示:
图5 显示节点画面更新循环流程图
其中数据同步用于同步视频播放进度,刷新同步用于同步缓冲交换操作。
集群利用主动立体显示时,必须利用帧锁相对显示输出信号进行同步。另外,在面向实时图形渲染的虚拟现实系统中,由于对实时性有所要求,一般要求画面刷新率达到60Hz左右,因此对渲染时进行的同步的性能要求也较高[16]。不同于实时图形渲染,在视频播放中,一方面视频播放时的每帧画面均必须进行严格的数据同步以保证一致性,而另一方面大部分视频的帧率不超过 30Hz,因而对程序运行帧率要求较为宽松。因此,视频播放集群的同步可以将软件方式与硬件方式进行结合,同时为偏振立体与主动立体提供支持,具有更好的兼容性与扩展性。
在本项目组已有的研究成果中[13],多投影视频播放系统并未采用主动立体显示,也未实现硬件同步。由于系统播放单个视频文件并且不会跳帧,因而能够将数据同步与刷新同步整合为一个阶段进行。而由于本文构建的系统面向主动立体显示,会启用帧锁相与刷新锁,并且组合视频在播放时允许跳帧,因而已有的同步机制不再适用。
本文实现的系统利用帧锁相为集群中的显示设备输出信号进行同步。另外,显示节点在每次执行画面更新循环时也进行软件同步,以保证各个显示节点在一致的时机显示一致的画面。同步模块利用网络在每次循环的画面渲染之前与之后进行数据同步与刷新同步;在启用硬件同步的情况下,系统还会启用刷新锁。
以本项目组已有研究成果为基础,本文系统的软件同步基于UDP通信协议,进行数据同步与刷新同步[13]。在同步过程中,同步客户端模块主动地向服务器模块发送同步消息并等待响应;同步服务器模块的数据同步线程与刷新同步线程被动地等待所有客户端模块相应的同步消息到达,处理各自的同步逻辑之后为所有客户端模块发送应答,如图6所示:
图6 软件同步顺序图
软件同步具体分为以下两个阶段进行:
2.1.1 数据同步:
(1)每次画面更新循环开始时,在渲染画面之前,每个节点利用同步客户端模块发送数据同步请求,将组合视频中所有视频文件的缓存信息发送给主节点的同步服务器模块,并等待响应。
(2)主节点的同步服务器收到所有同步客户端模块的数据同步请求之后,基于播放计时器的时刻和每个视频在所有节点上的缓存内容,为组合视频中所有视频文件显示的画面进行决策,将数据同步响应发送给各个节点的同步客户端模块。
(3)每个节点在同步客户端模块收到数据同步响应之后,依据服务器进行的决策,开始渲染画面。
2.1.2 刷新同步:
(1)渲染画面完成之后,每个节点利用同步客户端模块发送刷新同步请求,并等待主节点同步服务器模块响应。
(2)主节点上的同步服务器模块收到所有节点的刷新同步请求之后,立即给所有节点的同步客户端模块发送刷新同步响应。
(3)每个节点在同步客户端模块收到刷新同步响应之后,进行缓存交换。结束本次画面更新循环。
专业显卡具备与硬件同步卡配合进行帧锁相(Frame Lock)的能力,主流的显卡制造商例如AMD与Nvidia等均提供旗下专业显卡配套的同步卡[18-19]。通过将显卡与同步卡连接,并为同步卡之间建立专用的信号链路,多块显卡将同步地向各自的显示设备发送显示画面,因而可以在集群采用主动立体显示时,使集群显示设备同步地切换左右眼画面。
为了在集群系统中启用帧锁相功能,集群系统需要有一个同步卡作为信号源服务器,为集群产生帧锁相信号,并使得集群中的其他同步卡作为客户端接收此帧锁相信号。用户可以通过显卡专用的控制面板在集群中的每一台计算机上进行帧锁相信号配置。为所有计算机设置成功之后,整个集群即进入帧锁相。
除帧锁相之外,硬件同步技术还能够在多个应用程序之间实现刷新锁(Swap Lock),在这种情况下,应用程序进行的缓存交换操作将被同步执行。为使得多组应用程序能够分别利用刷新锁进行缓存交换同步,硬件同步技术中存在刷新组(Swap Group)与刷新栅栏(Swap Barrier)的概念,从而对刷新锁进行层级式的控制,如图7所示:
图7 硬件刷新同步的刷新组与刷新栅栏
每个刷新栅栏可以为多个刷新组实现同步,而每个刷新组可以为多个窗口实现同步。刷新锁功能至少支持1个刷新栅栏与1个刷新组。应用程序通过如下方式为自身启用和禁用刷新锁:
结合了软件同步与硬件同步的集群同步如图8所示:
图8 软件与硬件结合的集群同步
集群将为所有节点提供基于网络的刷新同步,并且刷新锁将自动为启用硬件同步的节点额外进行基于硬件的刷新同步。通过利用软件与硬件对缓存交换操作进行双重同步,系统能够为偏振立体与主动立体均提供支持。
在本项目组的已有研究成果中,多投影视频播放系统只进行单视频文件的逐帧播放[9]。然而此类系统上播放的视频质量大多为高清晰度的立体视频,具有超高的分辨率,使得视频解码的效率成为系统性能的瓶颈,对单个超高分辨率视频文件进行解码的速度可能无法使得视频流畅播放,并且未能充分利用现代多核计算机的并行处理能力。为了解决此问题,一些研究设计了分布式的视频解码方案[5,14],但分布式的视频解码对网络带宽要求较高,并且存在对视频格式的支持性问题。在虚拟现实系统中,可以通过对视频内容进行分层,在运行时按照需求动态切换不同质量的视频画面,从而提升系统效率[17],但视频播放系统绝大部分只显示原始清晰度的视频内容,没有必要采用分层技术。
本文实现了一种组合视频对象,使得用户可以将单个超高分辨率的视频资源编码为多个分块的视频文件,从而在播放时可以进行并发解码,该方案提升了解码速率,节约网络带宽,支持广泛的视频格式,并且使得系统可以播放分辨率超过视频文件编码技术分辨率上限的视频。
在用户为超高分辨率的视频资源进行分块编码时,生成的多个视频文件之间可能出现时间轴的偏差或异常。为了应对这种情况,本文还为组合视频设计了基于视频帧对齐的画面选择策略。
用户对组合视频进行配置的图形界面如图9所示:
图9 组合视频配置界面
可以指定组合视频的分辨率,时长,画面格式以及子视频信息等。用户配置完成的组合视频的所有资源以及配置文件将被集中在一个专门的文件夹内,方便移动与传送。
由于用户为组合视频准备的切块视频文件可能有多种切分方式,单块视频文件的立体格式可能为左右排列,上下排列或左右分离。为了应对多样的切分方式,组合视频支持对多种不同立体格式的视频文件进行组合,在播放时自动将视频的左右画面分别输出至组合视频的左右画面上。
在运行时,系统采用 DirectShow[20]进行视频解码并获取每帧画面,为了能够充分发挥多核计算机的并行处理能力,组合视频中的每个视频文件均有专用的解码线程与解码缓存。解码线程由 DirectShow自动创建,完成每帧画面的解码后将通过回调函数传递视频帧缓存。
解码缓存基于循环链表结构,如图10所示:
图10 循环链表缓存
并且利用互斥锁实现线程安全性,从而允许解码线程与渲染线程作为生产者与消费者,同时对缓存中的不同单元进行存取操作。作为生产者的解码线程完成一帧的解码后,将视频帧放入缓存中并设为占用状态,使得缓存内容增加。作为消费者的主线程在每个画面更新周期中从缓存内查找应当显示的视频帧,并将过期的视频帧设为空闲状态,使缓存内容减少。当缓存内容增加或减少时,缓存将依据自身占用率对解码器的行为进行调度,以避免缓存饥饿或溢出,如以下伪代码所示。
在图形显示系统的应用场景中,视频播放具有一定的特殊性,在运行时必须依照视频帧的时间戳对集群的画面进行同步。而对视频资源进行切分然后并发解码带来的一个问题是,系统运行时,解码线程的调度具有不确定性,在为组合视频选择视频帧时,必须依照所有子视频的解码缓存内容进行决策,以使得每一次刷新画面时组合视频中的每个子视频显示的画面具有时间一致性。
在理想情况下,组合视频中的所有子视频的时间轴均良好对齐,每帧一致的画面都具有完全一致的时间戳。在这种情况下,一种简单的视频帧选择策略如下:
(1)对每个视频,获取所有节点上该视频缓存中已被解码的视频帧的时间戳区段,对这些区段求交集,得出视频的集群缓存时间段,也即集群中该视频目前解码就绪,可以显示画面的时间段。
(2)对上述步骤求出的所有视频的集群缓存时间段求交集,得出的时间段即为组合视频当前有同步画面可以显示的集群缓存时间段。
(3)依照当前播放计时器时间与该时间段决定组合视频的实际播放进度,进而为每个视频文件进行视频帧选择。
这种简单的视频帧选择策略可以使得组合视频能够灵活控制播放行为与速率,并且具备良好的兼容性。但在现实中,对视频资源进行分块编码时,视频文件可能并不完美,视频帧的时间戳可能出现异常情况,例如多个视频之间,起始时间戳未能良好对齐,或某视频从某帧开始时间戳标定出现偏差,以及某个视频在编码时出现偶然的丢帧等。在这种情况下,简单的视频帧选择策略有可能失效。如图11所示:
图11 简单同步策略可能出现的失效
假定组合视频被分为两个部分Part1与Part2,并且两部分的时间轴出现了偏差,当计时器时刻恰好处在同步的两帧的时间戳之间时,简单的视频帧选择策略将会选择实质上不一致的视频帧。
因此,我们设计了具有一定容错性的视频帧对齐算法,如图12所示:
图12 通过组合帧进行画面选择
在组合视频每次从所有缓存中选择帧时,首先依照视频帧的时间戳进行组合帧对齐,并允许组合帧所包含的视频帧的时间戳具有一定偏差,从而使得具有偏差的视频帧能够对齐,再依照组合帧缓存选择组合帧;若未能为当前播放时间选择合适的组合帧,则采用备用的简单视频帧选择策略。这种视频帧对齐算法实质上是对原始视频帧信息进行抽象与包装,以此为基础实现较复杂的同步逻辑,它能够弥合不同视频文件之间的时间轴偏差,并且在遇到某视频丢帧时自动跳过丢失帧所属的组合帧。
视频帧对齐算法的执行步骤如下:
(1)组合帧对齐:按照时间戳顺序,为每一个尚不属于任何组合帧的视频帧进行组合帧对齐:定义组合帧内所有视频帧时间戳的分布范围上限为 FRAME_GROUP_THRESHOLD,选择该帧附近此上限范围内的所有视频帧,组成一个集合,若集合内包含该组合视频所有视频文件的帧,则可以认为该帧集合包含一个组合帧,其画面具有一致性。将每个视频缓存中与该帧最接近的视频帧组成的集合作为组合帧,加入组合帧缓存中,如图13所示:
图13 组合帧对齐
(2)组合帧选择:在组合帧对齐完成之后,从中选择时间戳平均值早于当前时刻的最新的组合帧进行显示。
(3)备用策略:若未能够找到适于显示的组合帧,则退而采用简单的视频帧选择策略,前提是每个缓存中均找到了早于当前时间的视频帧。这是为了避免尚未完全解码的组合帧的一部分视频帧被提前显示而导致画面不同步。
该算法的运行参数为进行组合帧对齐时的时间戳偏差阈值,也即FRAME_GROUP_THRESHOLD,其控制了算法的容错性:如果阈值选择过小,则视频帧对齐算法不能很好地发挥其容错性,从而退化为简单的视频帧选择策略;如果阈值选择过大,则会导致组合帧对齐时将不一致的画面帧匹配为组合帧,效果反而不如简单的视频帧选择策略。在实际应用中,我们采用组合视频中每个子视频标定帧间隔最小值的四分之一,为组合帧的时间戳偏差阈值,使得在视频帧率较低的情况下,组合帧的匹配要求也随之降低,在视频帧率较高的情况下,组合帧的匹配要求也随之而提升。
在实验中,本文搭建了具有两个显示节点的数字媒体显示系统,通过几何校正与颜色校正将投影画面进行拼接融合。测试环境配置如图14所示:
图14 实验系统架构
具体配置如表1所示:
表1 测试环境配置
其中,主节点连接Nvidia 3D Vision立体信号发射器,为快门眼镜提供立体信号。两台显示节点通过局域网进行网络通信。
在实验中,我们在主节点上收集并统计组合视频进行视频帧选择的运行耗时,以及两个节点上基于网络的数据同步与刷新同步各自的等待耗时。实验共进行5次,每次连续收集3000帧的数据并进行统计。统计数据显示帧选择算法平均运行耗时不超过1ms,数据同步平均耗时2.7ms,刷新同步平均耗时2.1ms。在同步模式下播放的4K分辨率视频表现流畅平滑。由于开启了帧同步,两个节点能够同步为左眼与右眼显示正确的画面。显示节点画面刷新率平均为47.0Hz,启用刷新锁的缓冲交换操作平均耗时 10.8ms,这种开销一部分来自于正常的同步开销,另一部分由于启用刷新锁时会自动启用垂直同步,程序的缓冲交换操作只能在60Hz的显示输出信号周期之间执行。
为了验证并发解码机制的有效性,我们使组合视频开启极速播放模式,在进行选择画面时不以播放计时器为参考,而总是选择最新的可用画面,在这种模式下,视频的播放速度与解码速度成正比。测试视频使用4096 * 2304分辨率,每秒23帧,XVID编码格式,总码率45.4Mbps的视频资源分别切割为2个、4个、8个视频文件作为组合视频进行播放,并与原始文件进行对比实验。视频时长40s,每渲染5帧画面记录一次实际时间与视频进度,实验重复3次。实验数据统计结果如表2所示:
表2 不同切分数下平均解码速率比
其中解码速率比意为给定时间内播放时长与实际时长的比值,该比值与视频解码速率成正比,当该比值小于 1时,意味着视频解码速率低于视频正常速率,视频无法流畅播放;当该比值大于1时,则意味着视频解码速率高于视频正常播放速率,视频可以流畅播放。由数据可看出,当视频被切为2块进行播放时,相比于单个文件播放已经表现出了解码速率提升,切为4块时解码速率进一步提升,当切块数变为8份时解码速率反而有所下降,这是由于显示节点使用的CPU具有4个核心,当视频切块过多时并发解码将导致频繁的线程切换。总体而言,对视频进行切块进行并发解码确实对视频解码的速率有所提升。
我们利用以上测试环境,在柱面幕上播放立体格式的《阿凡达》,系统运行效果如图15、16所示:
图15 系统运行效果图
图16 主动立体效果
本文面向基于多投影和主动立体显示的视频播放系统中的集群同步与视频播放,提出了一套解决方案。针对集群中的主动立体显示,设计了软件与硬件结合的集群同步方式,为视频播放,画面刷新,主动立体三个方面进行了同步。针对系统解码视频资源的效率,提出一种组合视频对象,通过在播放时进行并发解码提高效率,从而充分利用了多核计算机的并行处理能力,并且避开了单个视频文件的分辨率上限。实验证明本文提出的解决方案确实有效可行。未来,我们将根据技术的发展与用户的需求,继续研究面向多投影主动立体显示的视频播放系统,进一步提高系统的灵活性,高效性和可靠性。
[1] Ni T, Schimidt G, Staadt O, et al. A survey of large high-resolution display technologies, techniques, and applications[C]. Proc. IEEE Virtual Reality, 2006:223-226.
[2] Brown M, Majumder A, and Yang R. Camera-Based Calibration Techniques for Seamless Multi-projector Displays[C]. IEEE Transactions on Visualization and Computer Graphics. 2005: 11(2):193-206.
[3] Bhasker E, Juang R, Majumder A. Registration techniques for using imperfect and partially calibrated devices in planer multi-projector displays[C]. IEEE Transactions on Visualization and Computer Graphics,2007: 1368-1375.
[4] Chen Y, Chen H, Clark D, et al. Software environments for cluster-based display systems[C].Proc. First IEEE/ACM International Symposium on Cluster Computing and the Grid. 2011: 202-211.
[5] Chen H, Li K, Wei B. A parallel ultra-high resolution mpeg-2 video decoder for pc cluster based tiled display system[C]. Proceedings of IEEE International Parallel and Distributed Processing Symposium, 2002: 15-22.
[6] Renambot L, Rao A, Singh R, et al. SAGE: the Scalable Adaptive Graphics Environment[J]. WACE,2004: 23-24.
[7] Marrinan T, Aurisano J, Nishimoto A, et al. SAGE2: A New Approach for Data Intensive Collaboration Using Scalable Resolution Shared Displays[C]. Proc. the 10th IEEE International Conference on Collaborative Computing: Networking, Applications and Worksharing. 2014: 177 - 186.
[8] Dataton Inc [OL]. http://www.dataton.com/.
[9] Jiang Z, Mao Z, Qin B, et al. A high resolution video display system by seamlessly tiling multiple projectors[C]. Proc. IEEE International Conference on Multimedia and Expo, 2007: 2070-2073