一、前言
之前写过一篇老树开新花-通过Synergy100面板实现对BMD切换台控制的文章,主要介绍的是如何通过Synergy100切换面板对BMD切换台进行控制的,当时是刚接触BMD ATEM系列的SDK开发,最终实现了对BMD ATEM切换台PGM、PST、AUX三条母线的控制,应用上有些粗浅。
最近有机会做了一个BMD切换台和GVG 4000互转的项目,基本上把4级ME的切换台功能都用上了,在此总结加深下印象。
二、BMD ATEM系列切换台各功能实现方法
此次项目中GVG 4000到ATEM协议的转换,主要参照BMD ATEM系列切换台开发的SDK文档以及应用案例,关于ATEM系列切换台的API和接口原理,以及初期需要的环境配置,可参照我之前写的那篇文章,以下为这次项目中新增的一些功能。
2.1、获取切换台每级ME的实例对象
参考文档内接口IBMDSwitcherMixEffectBlockIterator,此接口通过IBMDSwitcher::CreateIterator返回对象,接口中定义Next方法,用来枚举每级ME的IBMDSwitcherMixEffectBlock接口对象,即对该ME操作的对象。具体代码如下图,此方法将每个IBMDSwitcherMixEffectBlock枚举出来,返回一个枚举对象,需要使用IBMDSwitcherMixEffectBlock的时候,只需要按顺序拿出,默认排序从ME1~ME N。
当获取到具体IBMDSwitcherMixEffectBlock的对象后,可通过SetPreviewInput、SetProgramInput、PerformAutoTransition等方法,对切换台当前ME进行各项正常操作,具体IBMDSwitcherMixEffectBlock接口下的方法有很多,可参考文档。
图2.1-IBMDSwitcherMixEffectBlock获取方法2.2、获取切换台所有AUX的实例对象
参考文档内接口IBMDSwitcherInputIterator,此接口通过IBMDSwitcher::CreateIterator返回对象,接口中定义Next方法,用来返回各类IBMDSwitcherInput对象,我们从这些返回input对象中,筛选并转换出AUX对象IBMDSwitcherInputAux,因此需要通过input对象的接口类型来判别,具体代码如下,我把所有返回的AUX对象加入了List列表中。
当获取到AUX对象IBMDSwitcherInputAux之后,可通过SetInputSource方法设置AUX母线交叉点,详细方法使用可参考文档
图2.2- IBMDSwitcherInputAux获取方法2.3、获取每级ME的上游键实例对象
BMD ATEM系列切换台每级ME带4个上游键KEY,同时切换台本身还带2个下游键DSK,上游键和下游键的获取方法类似,此次项目中,我只使用了上游键的获取方法。
参考文档内接口IBMDSwitcherKeyIterator,此接口通过IBMDSwitcherMixEffectBlock::CreateIterator返回对象,接口中定义Next方法,用来返回IBMDSwitcherKey对象,BMDSwitcherKey对象中,可通过setOnAir方法设置KEY键的上下,也可通过getOnAir方法获取目前KEY键的状态,具体代码如下,我使用了枚举器将每级ME的KEY都放进去,再供调用。
图2.3- IBMDSwitcherKey获取方法2.4、获取宏命令控制对象
BMD ATEM系列切换台可在切换台内存取本地宏命令,也可以供外部调用。参考文档内IBMDSwitcher接口,宏命令控制接口对象IBMDSwitcherMacroControl可通过IBMDSwitcher转换实现,它本身就是IBMDSwitcher接口的一个子接口。具体代码如下图,当获取到IBMDSwitcherMacroControl接口对象时,可通过Run方法运行宏命令,也可通过Record方法记录宏命,详细方法很多,可以参考文档。
图2.4.1-声明对象 图2.4.2-接口转换 图2.4.3-宏命令调用2.5、设置每级ME的转换方式
ME级的转换指的是Preview到Program的画面转换方式,主要有WIPE、MIX、DVE三种,具体使用IBMDSwitcherTransitionParameters这个接口,此接口对象需要通过IBMDSwitcherMixEffectBlock实例对象进行转换,当获取到IBMDSwitcherTransitionParameters接口对象后,再通过SetNextTransitionStyle方法,设置需要转换的方法,具体代码如下,bmdSwitcherTransitionStyleMix、bmdSwitcherTransitionStyleWipe等为固态参数。
图2.5.1-设置ME MIX方法 图2.5.2-设置ME WIPE方法2.6、设置每级ME内转换帧率
ME内的转换帧率指的时Preview到Program的画面转换时间,以帧为精确度,WIPE和MIX模式下,有不同的转换帧率设置方式,我们先需要通过IBMDSwitcherTransitionParameters获取当前ME级的转换方式,再通过IBMDSwitcherTransitionMixParameters或者IBMDSwitcherTransitionWipeParameters设置对应的转换帧率。
IBMDSwitcherTransitionParameters这个接口获取方式上文讲过,需要通过此接口下的GetNextTransitionStyle方法,获取并判定当前时MIX、WIPE、DVE中的哪种;IBMDSwitcherTransitionMixParameters和IBMDSwitcherTransitionWipeParameters接口,需要通过IBMDSwitcherMixEffectBlock实例对象进行转换,具体代码如下图,当获取到MIX或者WIPE接口后,再通过SetRate方法,设置帧率。
图2.6-ME 帧率转换方法三、GVG 4000切换台协议分析
3.1、TCP端口转虚拟串口
GVG 4000主要是通过串口进行控制,而BMD ATEM切换台是通过TCP端口进行控制,为了方便协议转换上的对接,我通过USR-VCOM这个软件将TCP端口虚拟化为一个串口接入GVG 4000,具体方式如下图,TCP Server端端口20108,映射为虚拟串口COM1,GVG 4000连虚拟COM1端口以后,所有都会被20108这个TCP Server端口接收。
图3.1TCP端口转虚拟串口软件3.2、GVG 4000协议数据说明
GVG 4000数据结构跟GVG 100/200类似,之前有过之前Syner100的开发案例,分析起来很快,所有数据交互均以16进制显示。
握手方式:发送-30 02,返回-84 03 00 EC 01。
ME1-ME4 PGM母线直切:发送-03 (00 01 02 03)C1 XX,其中第二位数据从00~03分别代表ME1~ME4,第四位数据XX表示交叉点。
ME1-ME4 PST母线直切:发送-03 (00 01 02 03)C2 XX,其中第二位数据从00~03分别代表ME1~ME4,第四位数据XX表示交叉点。
设定Transform方式位MIX或者WIPE:发送-04 (00 01 02 03)C6 02 (06 08),其中第二位数据从00~03分别代表ME1~ME4,第五位数据06表示MIX方式,08表示WIPE方式。
设定ME级的帧率:发送-05 (00 01 02 03) CC 80 00 XX,其中第二位数据从00~03分别代表ME1~ME4,第六位数据XX表示设置帧率的数值。
AUX母线交叉点设置:发送-03 (40 42 44 46 48 4A)C0 XX,其中第二位数据从40~4A分别代表AUX1~AUX6,依次类推,第四位数据XX表示AUX交叉点设置。
下游键DSK上下键设置:发送-04 00 02 (23 25 27 29),其中第四位数据23~29分别代表DSK1~DSK4的上下键。类似于一个出发按钮。
宏命令调用:发送-04 00 DB 00 XX,其中第五位数据XX表示需要调取宏命令的号数。
四、总结
BMD ATEM系列切换台以其功能强大,性价比高的特点,目前在广电、教育、影视上都有很多应用,而且不管是最便宜的ATEM Mini,还是到ATEM 8K切换台,底层的SDK调用都是一样的,这种开放性也衍生出很多可行性,尤其是在集中控制,未来可以尝试考虑构建一个以BMD ATEM切换台为核心的小型集控播出体系,笔者精力有限,只尝试了SDK开发包中的一小部分功能,以后有机会再补充。
网友评论