如何处理ToolBook中背景音乐
与其它声音之间的冲突
燕 忠
(空军气象学院计算机教研室)
ToolBook是Asymetrix公司推出的一种基于命令方式(Command_based)的多媒体开发软件,其特点是以页为单位而构成整本书,适合于电子读物、教育训练等方面的制作,其面向对象的程序设计方法以及超文本、超媒体等方面的实现,使其软件在众多的多媒体开发软件中独树一帜,不得不让人另眼相待。
由于ToolBook软件具有比其它软件概念清楚,对象层次、消息传递层次清晰明朗等特点,我们就选用ToolBook
(V4.0)来开发一多媒体电子读物。在开发的过程中,为增强听觉、视觉等表达效果,需利用许多声音、动画、录像,这样不可避免地涉及到一个争夺声道资源问题。例如,在播放背景音乐(.wav)时,若再打开一个配音声波文件(.wav),这时若不加以控制,就会得不到正确的配音;同样,在打开背景音乐的时候,若打开一个视频文件(.avi),这时处理不好,就只会出现视频文件的图象,而没有视频文件的声音,相反,所听到的,仍旧是背景音乐。这些现象的产生,主要是由于它们在播放的时候共同争夺同一声道资源而引起的。那么又如何处理呢?这里仅介绍对背景音乐与配音、视频文件在播放时,产生的三种冲突所采取处理的方法,背景音乐与其它媒体间声音的冲突,解决方法和思路与其基本类似。
首先,我们得谈一谈ToolBook中对象层次、消息传递层次结构。其层次结构如下:
可以看出,书的层次要比背景高,然后是页、组群,最后是按钮、热字、字段等单个对象。TookBook在对象之间传递消息的顺序是由对象层次结构所决定的。当对象接收到消息时,会产生两种事情之一。如果对象的脚本包含该消息的处理程序,ToolBook将执行该处理程序中的语句;如果对象的脚本并不包含该消息处理程序,ToolBook将消息按对象层次结构向上传送给另一对象。
其次,要明白怎样创建背景音乐的问题。要使背景音乐在整本书中反复播放,自然,我们想到idle消息。那么怎样对其进行控制以及其消息处理子的脚本应放在何处呢?显然,根据对象层次结构可知,消息处理子应放在书的脚本中为宜。因此,其处理子为:
to handle idle
if sysopenmedia is null or sysopenmedia is clip "bkmusic" \
or mmmediatype of sysmedia contains animation
if bkmusic of this book =true
if mmstatus of clip "bkmusic" is not "playing" as
text
mmplay clip "bkmusic"
end
else
mmclose clip "bkmusic"
end
end
end
这样,当系统无其它事可做时,便反复播放音乐,从而形成了背景音乐。
下面我们就考虑背景音乐与配音、视频文件在播放时,产生的三种冲突所采取的处理方法:
1、背景音乐与配音发生的冲突。假定需要在某页有文字的地方,给出其配音,此时应建立一个播放配音的对象,例如话筒按钮图标,以便读者根据需要播放配音声波文件(.wav)。为避免冲突,我们首先应关闭背景音乐或保存其有关信息(如mmPosition、mmBeginPoint等)后关闭,以释放出声道供配音文件播放。其脚本为:
to handle buttondown
if mmstatus of clip "bkmusic" is "playing"
mmclose clip "bkmusic"
end
mmyield
mmyield
mmyield
if mmstatus of clip (name of self) is "playing"
mmclose clip (name of self)
else
mmplay clip (name of self)
end
mmyield
mmyield
mmyield
end
2、背景音乐与视频文件在播放时发生的冲突。若需要在某页加上一段录像(.avi),同样应建立一个摄像机按钮图标,以播放该视频文件(.avi),其思路和前一种现象处理方法类似,先关闭背景音乐,后播放视频文件。其脚本为:
to handle buttondown
if mmstatus of clip "bkmusic" is "playing"
mmclose clip "bkmusic"
end
mmyield
mmyield
mmyield
if mmstatus of clip (name of self) is playing
mmclose clip (name of self)
else
mmplay clip (name of self) in stage "stage1"
end
end
那么效果如何呢?我们切换到读者状态,单击该按钮后,不难发现,图象仍能正常播出,声音也有,不过是背景音乐,并非是我们所求的,这说明声道仍被背景音乐占有。怎么会出现这样的现象呢,又是谁播放这段音乐呢?究其原因,可以知道,播放这段音乐的只有书的脚本才有,那一定是idle在作怪。当系统执行完buttondown
处理子后,由于录像没有及时占领住声道,导致系统在执行完书的idle处理子后,声道又被背景音乐夺回,从而形成了以上现象。那么又怎样对它进行控制呢?第一种想法是录像必须赶在背景音乐启动之前控制住声道,可以用mmplay
(name of self) in stage "stage1" wait来控制,但其缺点是若播放录像,必须等到录像播放完或用ESC键强制退出,是达不到由用户再次单击该按钮就终止播放的目的;第二种想法就是对
idle
进行控制。显然在书的脚本内对其控制是达不到的,在背景控制也是不适宜的,所以我们不妨在页的脚本中对其进行控制。只要我们在播放视频文件时,根据媒体的一些性质(如mmMediaType,mmIsopen等)来控制背景音乐,关闭它,这样就达到了目的。其脚本为:
to handle idle
----只要媒体中在播放录像,就应关闭任何声波文件,
if sysOpenMedia contains clip "minggong"
mmClose "waveAudio"
break
else
----否则,就执行书的 idle 处理子
forward
end
end
结果如何?效果肯定不错。不信,试一试!
3、在同一页中,既有背景音乐,又有配音和录像。显然,这种情况可以看作是前两种的综合,只不过这里有个交叉问题,就是在播放配音时,不仅要考虑关闭背景音乐,而且要考虑关闭录像,在播放录像时,不仅要考虑关闭背景音乐,而且要考虑关闭配音。
其播放配音的按钮图标脚本为:
to handle buttondown
if mmstatus of clip "bkmusic" is "playing"
mmclose clip "bkmusic"
end
if mmstatus of clip "006" is
"playing" ----关闭录像
mmclose clip "006"
end
mmyield
mmyield
mmyield
if mmstatus of clip (name of self) is "playing"
mmclose clip (name of self)
else
mmplay clip (name of self)
end
mmyield
mmyield
mmyield
end
其播放录像的按钮图标脚本为:
to handle buttondown
if mmstatus of clip "bkmusic" is "playing"
mmclose clip "bkmusic"
end
if mmstatus of clip "jj03" is "playing" ----关闭配音
mmclose clip "jj03"
end
mmyield
mmyield
mmyield
if mmstatus of clip (name of self) is "playing"
mmclose clip (name of self)
else
mmplay clip (name of self) in stage "stage1"
end
mmyield
mmyield
mmyield
end
当然,播放录像时也要在页中加入对idle的处理,处理子与上面所讲的基本一样,这里就不在列举了。
为了保持播放背景音乐的连续性以及保证在离开本页时关闭其它媒体,如配音、录像等,需要在航行到下一页时对它们进行控制,此时应在本页的脚本中加上对leavePage消息的处理,其脚本为:
to handle leavepage
if mmstatus of clip "bkmusic" is not "playing"
mmclose all
end
end
这样,问题就基本解决了。我们再回过头去看一下idle的脚本,可以知道有三种情况需要判断是否要播放背景音乐:1、没有任何媒体在播放。此种情况的发生是在当播放某一视频文件或声波文件时,按下了某一航行到另一页的按钮时,页脚本会执行leavePage处理子,关闭所有视频或配音,而没有启动背景音乐,这时应根据播放背景音乐的控制属性
(bkmusic of this book)
来判断是否要播放背景音乐;或者用户改变了要播放背景音乐的控制属性时,由原来不播放背景音乐到现在要播放背景音乐;2、打开的背景音乐是否要将其关闭呢?也就是播放背景音乐的控制属性
(bkmusic of this book) 是否改变了呢?3、打开的媒体中还存在动画。由于动画与背景音乐是不会产生争夺声道资源问题的,其处理方法与第二种方法一样。其中播放背景音乐的控制属性
(bkmusic of this book)
可以用热字、热键、按钮或图形等对象来对它进行设置。
当然,处理这类问题,肯定还会有其它的方法。这里,我只不过结合自己的开发经验,谈了一下自己探讨这个问题的一点思路而已,仅供大家商榷。
|