Vizrt在电视新闻类节目中的技术研发的探索与实践
——Vizrt二次开发具体案例分析

2014-09-12 08:25郭轶君
关键词:副标题关键帧插件

郭轶君

(江苏电视台 新闻中心,南京 210008)

1 综述

在线包装系统是一种新型的电视包装手段,2000左右年进入中国,但在欧美各国这项技术早已全面应用,即使在东南亚各国也早已具备多年的成熟应用经验。

目前世界上得到业界认可的有两家大型在线包装品牌,vizrt与奥威。下文以vizrt为例,阐述在对vizrt 本身运行机制的深入理解的基础上,进行二次开发的应用与研究,最终能够适当的扩展软件的功能,满足更为广泛的包装需求。

2 新闻类在线包装二次开发具体案例分析

2.1 UI式的开发DataPool(数据池)

DataPool是viz的一个数据插件模块,之所以和开发牵连起来是因为它出现的目的是为了简化我们编写脚本的工作量。viz的所有图形操作都基于viz command(viz命令),举例说明比如建立一个box(盒子)物体和一个字体物体来表述一个直方图,为了设置其高度我们需要向viz发送命令让box的高度为10 字体显示为10。或者我们需要从viz外部改变它的某项属性,我们需要访问容纳这个box物体的container在场景树中的层级路径,并且我们必须访问它唯一的名称,这样我们需要编写一句命令。反复编写这样的代码工作量比较大而且也比较繁琐,viz DataPool解决了这样一个问题,我们需要的是通过viz DataPool DataFiled(数据变量)来存储数据,进而改变一些图形的属性或者控制场景中的各类数据,使各类数据相互配合达到一个比较高级的效果。通过DataPool,将DataText(数据字体)插件加载在字体物体上,将DataScale(数据缩放)加载到cube物体上,通过一个命名为 DataBar的 DataFiled将数据同时传递到两个物体上。这样当DataField的数据发生变化,二者的属性将同时变化。当这样一个DataField注册到场景中,任何外部的软件都可以通过名称直接访问场景数据,而不需知道具体的场景层级路径。

通过viz DataPool我们可以强化很多交互效果甚至可以修正很多实际播控中出现的逻辑悖论。从一个最简单的案例入手,讲解一下联动的效果:在播控中从外部修改数据进而触发一个数字增长动画。在DataPool环节我们需要做的工作就是用DataText表征数字的字符串向量,用DataAnim(动画数据)来控制数据的具体变化。之后通过脚本修改DataAnim的关键帧就可以交互式的控制数字增长动画。由于本节讲解DataPool,脚本放在下节讲解。第一步,建立一个字体图形加载DataText将其DataField命名为NO。第二步,建立一个空的Container 加载DataAnim同样命名为NO。将DataAnim 的Animation Type设置为Float(浮点数),这时只要对Data Anim 的Value(数值)属性记录关键帧字符图形将显示Value的变化数据。

DataPool有几十种数据控制类型,除了典型的变换属性,还可以控制关键帧属性、材质属性、纹理属性、鼠标数据、键盘数据等。通过viz DataPool 我们可以控制viz世界里任意物体的所有属性,从而摆脱viz UI(用户界面)的功能限制。

为了更好的理解DataPool再讲解一个稍微复杂一些的案例,从而为之后结合脚本程序的案例打下一些基础。以柱状统计图动画为例,用户希望可以控制其高度属性,同时需要一个标识来进行数据的变化展示。之前已经讲解过如何实现数字变化,这里我们还需要这个小的数据图标一直固定在柱状图的顶部。这样的效果,我们可以通过密集记录关键帧实现,但是在线播控阶段这是不可能的,那么如何实现这样的效果呢,首先我们来分析一下思路,这个案例中涉及两个属性,一个是柱状图的y轴缩放属性,另一个是图标的y轴位移属性。这两个属性如何配合就是问题的关键。缩放的数据变化是从1开始变化的,且变化速率比较快,数据变化一个单位高度变为原来的两倍,然而位移属性增长一个单位根本看不出任何变化。而且起始状态下,缩放默认为1,而本案例图标对齐到柱顶位置默认值为-42。如何解决这两个问题呢?通过调节参数就可以发现二者的数据变化存在一个比例关系,而且这个比例关系肯定是固定不变的,通过人为的经验测试可以得出这样的一个常量数据,这里我得出109.5。那么现在需要的是让缩放的数据除以99.5来控制图标的位移属性,这个问题就解决了。对于起始位置有错位这个问题很容易解决,对位移属性的控制是基于物体的自身坐标,为了不影响自身坐标的变化,只需要为其建立一个父级别的控制组,通过控制父级别的y轴位移属性让起始位置对位。以下我给出具体的制作步骤:

1.建立空Container 加载 DataAnim 将Data Field命名为 ctr。

2.建立一个Container 加载DataScale将Data Field命名为 ScaleY,另加载一个DataMath数学运算节点,变量一设置为ctr变量二设置为 99.5 算法设置为除法。输出变量设置为ScaleY。

3.建立一个图标加载DataPositon 将DataField命名为ctr。为其建立一个父层级的Container,通过改Container将图标移动到柱图的顶部位置。现在通过调节,DataAnim的value属性就得到了最后的效果。

在直播阶段通过这样的装配可以实现实时的触发与修改由设计师设计好的动画,否则所有的动画形式都只能停留在后期阶段,也就失去了在线包装的在线特性。当然DataPool的功能远不仅如此,通过与viz conmmand 、viz script (viz的脚本系统)配合几乎可以实现任何交互控制的动态效果。

以上所讲都着重体现在线效果,下面还有一个小案例,说明了DataPool在优化播出流程,提升播出效率方面的能力。

如图1,该OSP的首次上线,给播控人员造成了一定的播控困难,按照常规思路,该曲线统计图需要9个数据来进行绘制,就需要播控人员在控制软件中依次点击修改18个参数(8个控制曲线数据,8个控制显示数据),对于播出前的紧张状态而言,这样的流程显然存在一定的风险。那么如何可以简化播出制作的流程尽量减少修改时间呢?经过思考,我利用DataPool中的DataParameter(数据参数) 实现了同时控制每对数据,并且将所有数据列入一个表单,无需依次点击修改。

DataParameter 专门用来控制其他功能类或者几何体类型的插件。

图1 股市数据统计图 数据池批量控制曲线图数据

图2 股市数据统计图工程的树状分布图

图3 股市数据统计图 首个DataPool插件的属性面板

图4 股市数据统计图 第二个DataPool插件的属性面板

利用两套DataParameter分别对LineChart 与 DataLabel 进行了控制,在 vizrt中 LineChart(线状图表)属于几何物体,DataLabel属于功能物体。对于加载在与LineChart同一个Container之上的Data Parameter而言,(上图中用黄色高亮标示出)参数类型,我们必须选择Gemotry 对参数名而言我们控制的是曲线Y轴方向的数据,手动填写DataY(Y轴向数据),如图3。同理,另外的DataParameter中参数类型设定为功能Function(功能),参数名称在DataLable(数据标签)中查找为Data,如图4 。Function Name(功能名称),填写DataLabel 表明了功能插件的确切名称。两个DataParameter插件中的FieldName都为Line,这样是用来接收来自控制插件DataControl(数据池外部控制插件)的数据。在同一个Container之上,无法同时加载两个以及以上的DataPool插件。本案例中,需要同时访问的参数必须加载在同一个Container之上,通过Use Other Container(使用其他容器)可以实现不同DataPool插件对同一个Container之上的不同数据控制的功能。

3 脚本、DataPool、VizrtCommand在解决各类场景问题与提升交互效果方面的应用

3.1 DataPool与VizCommand配合访问场景数据

由于viz command 与viz script的加入,我们不必局限于软件的既有功能。那些利用现成的功能无法直接实现的想法,通过viz Command与viz script的简单应用便可柳暗花明,巧妙地运用二次开发技术使得设计者的想法不必局限于软件的默认功能。

图5多类属性响应外部数据在建设银行曲线图表版式上的应用,需要完成这样一个线状统计图,当播控人员输入月份与日期之后,Take(播出)该OSP(屏幕图形文字系统),红色日期图标会自动自01动画至具体的某一个月份,月份与日期也会相应的产生一个增长动画停止到输入的日期。这样的效果如果利用普通的字幕机来完成,必须后期制作成完整的序列帧文件,且无法即时修改,当日期产生变化时,只能重新制作另外一套序列帧,无法满足在线播控的随机性,每天消耗人力完成这样的效果得不偿失。利用在线包装综合多种相应技术即可完成这样的效果。

实现方案分析:

(1)在播控端需要能够读取到播控软件输入的日期与月份数据。首先建立三个文本控制权限用来取得外部输入数据。同时利用场景脚本将数据分别存储在三个字符变量之中。

con = Scene.FindContainer("KF")

conn =Scene.FindContainer("KFF")

coonn =Scene.FindContainer("KKFF")

图5

a =con.geometry.text

b =conn.geometry.text

c =coonn.geometry.text

println a

println b

println c

(2)制作月份、日期、图标位移动画,由DataAnim、DataText与 DataAnim、DataPosition共同作用。分别将DataAnim的OutPut field name与 相应的DataText DataPosition的FiledName设置为相同名称。这样由DataAnim产生的数据变化将直接影响DataText与 DataPosition所控制的插件的属性。

(3) 实现关键帧即时修改功能。在三段相应的动画中,随情况不同,日期月份,标签位置的动画都不尽相同。即关键帧在播控时可以被修改,我们将三个动画的开始关键帧均设置为0,末尾关键帧则由外部输入数据进行修改。我们需要在场景被保存后第一时间实现关键帧的修改,故将所有程序写进VizScript的回调函数:Oninit之中,并且在时间线上对该函数进行调用。首先我们需要获得三类Channel的关键帧变量。

obj =Scene.FindContainer("OB") //存贮日期数据的Container变量

oobj =Scene.FindContainer("OOB")//存贮月份数据的Container变量

oobjj =Scene.FindContainer("bar")//存贮图标的Container变量

ch=obj.findorcreatechannelofobject("IntValue")

//通过Container对象的成员函findorcreatechannelofobject 返回控制日期的DataAnim动画Channel

CHH=oobj.findorcreatechannelofobject("IntValue")

//通过Container对象的成员函数findorcreatechannelofobject 返回控制月份的DataAnim动画Channel

CCHH=oobjj.findorcreatechannelofobject("FloatValue")

//通过Container对象的成员函数 findorcreatechannelofobject 返回控制图标位置的DataPosition动画Channel

于是利用所取得的Channel变量,继而可以访问channel内部的关键帧数据。

temp.delete() //取得的三个属性的初始关键帧数据,由于vizrt可以在时间线同一时刻,记录无数关键帧,所以在修改关键帧之前必须取得初始关键帧进而对其删除empb.delete()

tempc.delete()

temp1.delete()

tempb1.delete()

tempc1.delete()

k=ch.addKeyframe(0) //将零帧数据设置为0

k.IntValue=0

KEY=CHH.addKeyframe(0)

KEY.IntValue=0

KEYC=CCHH.addKeyframe(0)

KEYC.FloatValue=0

k=ch.addkeyframe(1) //利用之前存贮的月份日期位置数据对三组末尾关键帧写入数据。

k.Intvalue=cint(a)

KEY=CHH.addkeyframe(1)

Key.IntValue=cint(b)

KEYC=CCHH.addkeyframe(1)

KEYC.FloatValue=(cint(c)-1)*35 //根据时间轴线长度,推到出合理公式,满足数据时间轴坐标的对应关系。

println k

println KEY

println KEYC

最后在时间线上播放动画时,将VizCommand写入关键帧调用Oninit函数,驱动所有图形动画播放。

如图6。

图6 建设银行图表版式中Action(一种在时间线上可以记录viz命令的关键帧)关键帧的具体位置与具体命令

3.2 VizScript对切换逻辑中逻辑矛盾的修复

2013年初新闻中心全新改版,按照栏目需求字幕条系统分为主标题,副标题,快讯标题,且主标题宽度大于副标题大于快讯标题。按照切换逻辑的常规思路,我们可以实现,三条标题单独播出,若先播出副标题,播出主标题时,副标题同时缩小,上移动。同理,若先播出快讯标题,播出主标题时,快讯标题同时缩小上移。如果我们想实现,在播出快讯标题后,播出副标题,快讯标题同时上移缩小。那么我们无法同时满足快讯标题上移缩小的动画与播出主标题时候产生的上移缩小的动画。

如图7所示。为了实现主标题与副标题交互动画效果,将副标题上移缩放动画放置于主标题的Director(ZMT)中。当主标题被触发,同时副标题也发生了上移与缩放动画,无论此时副标题是否播出实际的空间坐标已经发生了变化。同理我们可以实现主标题与快讯标题的交互动画,将快讯标题的上移缩放动画KX放置于同一Director之中。按照相同的思路,实现副标题播出时快讯标题同样上移,将快讯的上移动画放置于副标题的Director(FBTLOGIC)之中。如图8。

图7 主副标题交互触发效果的动画设计部分

图8 快讯标题与副标题交互触发效果的动画设计部分

于是问题出现了,我们应该如何设置这样一个快讯的上移动画?将主标题之中的快讯动画直接复制进入该Director?但是viz的动画是具有唯一性的。如果一段动画同时在两个Director之中播放,那么结果将是两段动画的合成。单独为快讯制作一段上移动画,按照设计方案,我们不希望快讯被副标题顶起产生缩放动画,所以只有上移动画。那么,当我们播出快讯继续播出副标题,结果将是正确的。如果我们播出快讯之后继续播出主标题也是正确的。但是当我们播出了快讯,继续播出副标题,继续播出主标题,那么错误出现了,快讯将不在正确的位置偏离于副标题之上,这就是在主标题与副标题中的两段快讯动画产生了合成作用。在这套切换逻辑的制作过程中,我们没有违反切换逻辑的任何逻辑规则,但是结果是不正确的,切换逻辑本身已经对这样的逻辑问题没有解决之道了,于是我们需要借助Viz Script来修正这种情况。这里我将给出程序的编写与操作思路,具体的代码就不再逐一解释。

建立函数ChangeKeyFrame(),根据图9中的布尔值进行逻辑判断,当state1时,修改KX 两端关键帧,当ZBTorXBT=true时,POS_1 Scale_1、POS_2 Scale_2;ZBTorXBT=false时,POS_1 Scale_1、POS_3 Scale_3。

SETKX()设置变量ZBTorXBT的值;SETSTATEkx()SETSTATEzbt()SETSTATExbt()设置stage状态;

当state为 ZBT=true;XBT=false;KX=true时,修改KX 两端关键帧分别为POS_2 Scale_2、POS_4 Scale_4;

当state为 ZBT=false;XBT=true;KX=true时,修改KX 两端关键帧分别为POS_3 Scale_3、POS_4 Scale_4;

State默认状态均为false;

同时需要在DIRECTOR KX之上建立两个CommandKeyframe,分别键入命令

1:THIS_SCENE*SCRIPT INVOKE SETSTATE

图9 三类标题的状态分析

kx true;正向执行

2:THIS_SCENE*SCRIPT INVOKE SETSTATE kx false ;逆向执行

在DIRECTOR ZBT 上建立三个CommandKeyframe,分别键入命令

1:THIS_SCENE*SCRIPT INVOKE SETSTATEzbt false;

THIS_SCENE*SCRIPT INVOKE SETSTATE ZBTorXBT true;

THIS_SCENE*SCRIPT INVOKE ChangeKeyFrame();

THIS_SCENE*STAGE*DIRECTOR*KX CONTINUE;正向执行

2:THIS_SCENE*SCRIPT INVOKE SETSTATEzbt true;正向执行

3:在第一个关键帧之前建立第三个关键帧

THIS_SCENE*SCRIPT INVOKE SETSTATEzbt false;

THIS_SCENE*SCRIPT INVOKE SETSTATE ZBTorXBT true;

THIS_SCENE*SCRIPT INVOKE ChangeKeyFrame();

THIS_SCENE*STAGE*DIRECTOR*KX CONTINUE REVERSE;逆向执行

在DIRECTOR XBT 上建立三个CommandKeyframe,分别键入命令

1:THIS_SCENE*SCRIPT INVOKE SETSTATExbt false;

HIS_SCENE*SCRIPT INVOKE SETSTATE ZBTorXBT false;

HIS_SCENE*SCRIPT INVOKE ChangeKeyFrame();

THIS_SCENE*STAGE*DIRECTOR*KX CONTINUE;正向执行

2:THIS_SCENE*SCRIPT INVOKE SETSTATExbt true;正向执行

3:在第一个关键帧之前建立第三个关键帧

THIS_SCENE*SCRIPT INVOKE SETSTATExbt false;

THIS_SCENE*SCRIPT INVOKE SETSTATE ZBTorXBT false;

THIS_SCENE*SCRIPT INVOKE ChangeKeyFrame();

THIS_SCENE*STAGE*DIRECTOR*KX CONTINUE REVERSE;逆向执行

这样,利用少量的VizScript程序就解决了之前所产生的问题。

4 结论

在线包装的设计需要依靠一定程度的编程知识与丰富的经验来总结科学地提升制作效率的手段,让在线包装的在线特点得到有效的体现。由于直播过程中存在很多不确定因素,设计师在从事在线包装项目时需要考虑到如何能将这些不确定突发的行为变成可以交互式完成的,而不是依赖于大量的重复性劳动来暴力解决。

通过对在线包装系统二次开发的一些初步探索我希望可以为读者建立一种观念:作为一名在线包装设计师需要考虑的不仅仅是构图、色彩、动画、质感这些传统的图形设计问题,更需要考虑并能付诸实现的是如何从多方面增强播控的交互性——即如何让操控者可以更灵活的去控制你所设计的场景、如何去提升整个包装流程的制作效率、如何保证自己制作的场景可以安全播控、如何为制作团队提供更多有效可行的实现方案扩展创意思路。以上所述本人也只是初步探索,希望可以有更多的设计师深入探索这一课题,并共同进步。

[1]Vizrt Artist User Manual[M].1059-1076.

[2]金斯利休斯.VBScript程序员参考手册[M].北京:清华大学出版社,2009.

[3]叶翊霳.FLASH ACTIONSCRIPT程序设计经典商业范例集[M].北京:清华大学出版社,2009.

[4]彼得斯. Flash ActionScript 3.0 动画高级教程[M].北京:人民邮电出版社,2010.

猜你喜欢
副标题关键帧插件
基于图像熵和局部帧差分的关键帧提取方法
自适应无监督聚类算法的运动图像关键帧跟踪
自编插件完善App Inventor与乐高机器人通信
基于块分类的矿井视频图像DCVS重构算法
基于OSGi的军用指挥软件插件机制研究
基于误差预测模型的半自动2D转3D关键帧提取算法
浅议副标题在写作中的妙处
基于jQUerY的自定义插件开发
硬派健身
《创业维艰》