当前位置: 主页 > 平面设计 > Flash声音高级篇:NullSound技术

Flash声音高级篇:NullSound技术

  • 2022-03-13
  • 来源/作者: 不详    / 佚名    
  • 4 次浏览

原文出处:http://www.bluegelmedia.com
  原作者:Brett E. Yokom / killersound, Inc
  翻译:Jimbob

概要

  本书介绍“NULLSOUND”stream技术的详细说明。该技术可以比传统的声音stream技术节约90%的文件体积大小,并保持声音和动画完全同步。

序言

  我们先从Macromdeia Flash原有的技术的总览开始讲,后面再来描述具体实现的方法。

  现在的互联网中,动画网站正在迅速的增长。人们已经不再满足于使用奇特的矢量造型,漂亮的颜色和动画,你还必须创造很酷的音乐和音效来吸引访问者的注意。以前的Flash设计师(1998/1999)只是利用简单的循环音效来打破沉默的web世界,接着,这些循环音效变得越来越复杂,结果造成了文件体积增大,增加了下载的时间。同时,市场上也产生了这样的需求:一些优秀的动画(例如在电视上播放的广告),要求图像必须和音乐以及音效完全同步。但是Flash里面的声音,能同时满足这些要求么:既要小文件体积,又要和图像同步?Macromedia 提供的解决方案就是把声音设置成Stream方式。

  这种方式是很有用的,基于以下两个方面原因:

  1.Flash 播放器不需要一直等到所有的声音全部下载完成才继续播放,只要下载一部分预先缓冲的声音,就可以马上开始播放了。这有点类似于Real以及Microsoft media player用的流媒体技术。这项技术在宽带接入的互联网用户上表现很好,但是对56k以及以下拨号用户,则会出现问题: 这些用户可以在flash没有完全下载时开始观看,但是随时都可能因为带宽不够而造成动画的停止,最好是等所有的都全部下载完以后,再开始播放它。

  2.使用stream方式可以保持绝对的播放帧率。 如果你不使用stream方式,设置flash 的fps帧率设置为25,那么这并不意味着Flash将一直以25帧/秒的速度播放,实际的帧率将取决于你的CPU,CPU越强,则实际播放帧率越接近于预设的值。举个例子说就是你在奔腾166机器上播放的帧率为8~9,而用奔III-500播放的帧率则达到22。理论上讲,如果你设置帧率为25,那么CPU只有1/25秒的时间来计算播放一帧所需要的所有元素。如果CPU的速度达不到这个要求,比如它可能花上1/5秒的时间来计算,那么实际的fps就会降低为 5 fps,如果你的Flash包含100帧,那么理论上播放完只要4秒,而实际上播放需要20秒,flash播放变慢了。

  解决方案就是使用stream方式的声音!在主时间线上使用stream方式的声音,将告诉flash播放器:“你必须保持声音的播放速度,播放变慢是不允许的!” 结果,不但声音,图形的播放速度也一样保持了同步。那么一个速度低的CPU能用25的帧率处理完所有的数据么?答案是: 不可能。 速度的保持是虚拟的,CPU采用忽略未处理的帧来保持帧率的稳定,例如上面提到的例子,用这种方式处理的话,Flash中只有1/5的帧能被显示,其他都被忽略了(这样在某些情况下,可能造成明显的跳帧现象)。

  在本书里,我们并不想专门来讨论如何使用声音的event方式或者stream方式,介绍这类的文章可以在 www.macromedia.com或者 www.flashmagazine.com 等地方找到。我们所感兴趣的是:如何更深入的应用这些知识

方法说明:

  采用声音的stream方式,有个主要的缺点:它非常的增加文件体积大小。 这个是由于stream技术本身造成的。如果你使用一个2秒的声音,循环100次,那么声音的总长度为200秒,我们用stream方式导入这200秒的声音。如果声音的原始大小为10k,那么输出的swf文件将包括大约1M的声音,这是估计值,考虑到声音的质量以及一些其他的因素,它的实际大小应该是800~900k。如果用56k拨号上网的平均下载速度4.5k来考虑,用户需要大概200秒(超过3分钟)的时间来下载。如果考虑更低的上网速度比如2.5k,那么需要大概5~6分钟才能下载完.

  于是得出结论:文件大小是个大问题.

  一个有趣的现象就是,如果我们使用比较小的声音来使用stream方式,那么最后输出的swf文件大小将会小很多。如果整个音乐是采用killersound教程里使用的技术(www.killersound.com),那么采用一个声音文件(比如最小的那个)作为stream方式而其他声音文件使用event方式就已经足够了。经过多次测试,我们得到以下的结论:利用layer将其中一个声音文件设置成stream,其他声音文件则不设置为sream方式,效果是完美的。这也意味着Flash可以作为一个混音器来使用。

  那么我们怎样才能更深层次的减少文件体积呢?如果我们选择压缩声音质量(比如: ADPCM, 5 kHz, 4 bit)结果将不会让我们满意。文件体积是小很多了,但是声音效果太差了! 解决方法就是下面的 str0 以及 str00 技术,这就是我们所谓的 "NULLSOUND STREAMING" 技术。

  在开始讲述这项技术之前,让我们来看一看比较结果:

  应用这项技术最明显的例子就是 killersound 为虚拟现实开发的片头上。 这个片头包含了1分钟的复杂音乐和音效。使用了5个声音文件,每个文件都有不同的压缩位数从而达到整体的音质要求。在这个例子里,背景音乐只需要8kbit/s的mp3文件(因为里面包含了主要的低频部分),高频的鼓声等部分则需要32kbit/s的mp3文件。根据我们后面要介绍的技术,我们还需要使用一个0.1秒长的"NULLSOUND"文件。因为我们需要保持动画和声音的同步,片头的帧率必须恒定,这就意味着我们必须采用stream方式。

  在传统的方式中,只有一个或者所有的声音全部都被设置成stream方式,这样的话,stream声音本身的比特率必须设置的很高以满足某些音质的需求,这也意味着我们浪费了不少的空间。采用新的NULLSOUND stream技术的话,我们可以为每个声音文件设置不同的比特率,从而保证文件变小。

  下面的表格中显示了片头在不同技术下面的输出文件大小。 str1和str5采用了传统的方式,str0和str00则采用了新技术。需要提到的是,文件不但包含了音乐,也包含了动画,所以文件体积比较大。

str1 : 1个循环音效设置成 STREAM音质为MP3, 48 kbit/s, MONO,其他音效设置成EVENT音质为根据不同音效分别设置不同的优化值
结果:音乐大小 595 KB (文件大小 1.25 MB )

str5 : 5个音效全部设置成 STREAM音质为MP3, 48 kbit/s, MONO
结果音乐大小 594 KB (文件大小 1.24 MB )

str0 : "NULLSOUND"音效设置为streamed 音质为 MP3, 8 kbit/s, MONO, 其他音效设置为EVENT音质为根据不同音效分别设置不同的优化值
结果:音乐大小 192 KB ! (文件大小 847 KB )

str00: "NULLSOUND"音效设置为streamed 音质为 MP3, 8 kbit/s, MONO, 其他音效设置为EVENT音质为根据不同音效分别设置不同的优化值
结果:音乐大小 59 KB !!! (文件大小 714 KB )

这些结果是有说服力的,假如我们制作一个“无声”版本(所有的动画保持原状,只删除了所有的声音)那么输出文件大小为655kb 。如果我们比较一下两个文件的大小差异的话,结果说明采用str00方式的整个声音文件只占用59kb!!!而采用传统方式的话,音乐文件将占用595kb.

  进一步说明:如果有5到6个2,3秒的声音文件,构成1,2,3分钟甚至更多时间,音乐文件占用的体积将低于70~80k.相对的,如果采用传统方法处理的话,占用文件大小将是1MB甚至更多。

下面介绍一下工作原理:

  str0技术:

  首先,让我们选择一个尽量小的声音文件"NULLSOUND"。这个小的wav文件里面除了静音啥也没有,大概0.1秒长。我们可以用任何声音编辑软件来生成它。 然后我们把这个文件放到timeline里面,然后设置为stream方式,并设置循环次数以便声音一直延长到Flash的结尾。我们只设置这个NULLSOUND文件为stream方式的,其他声音用层来组织,都设置成event方式。这样,我们就可以把stream声音的输出质量设置成足够低(ADPCM 5 kHz 2 bit)同时却不影响整个音乐的音质,因为event方式的声音可以设置高一些比如ADPCM 11 kHz 4 bit. 。

  请看下面的图例:

图1. str0技术里面的主时间线


 

图2. 时间线里NULLSOUND声音的设置


 

图3. 导出情况下的stream和event声音音质设置
我们可以微调一下上面的技术,从而使文件体积更小,就是我们称为str00技术:

  str00技术:

  我们把前面技术中,NULLSOUND的循环次数设置成1次,其他的保持不变。 这项技术是建立在flash的一个有趣的特性基础上的: 如果时间上有个声音文件设置成stream方式,那么flash在播放完这个声音文件后会继续以stream模式播放声音。也就是说,我们可以用这样一个小的NULLSOUND声音文件作为一个开关,使整个播放器用stream模式播放声音。这种stream播放模式可以使用"Stop All Sound"动作来关闭。使用这种方法,我们也可以在影片中灵活的切换stream模式或者是event模式,也就是可以在恒定帧率以及帧率可变模式中切换。

  下面的图例表述了这种str00技术

图4. 主时间线上的NULLSOUND只循环一次

图5. NULLSOUND声音的设置


  str00技术的附带说明:

  str00技术的唯一缺陷在于:假设用户使用独立播放器来播放flash,那么如果用户在播放时候敲回车键,那么flash将停止所有的声音的播放,即使再按回车继续播放,其他声音都能正常播放,而stream的声音将不能播放,因为stream声音的关键帧是在最前面,这样的后果就是播放的stream模式被关闭了,也就是恒定帧率模式被关闭了。要避免这种错误,解决的方法就是安置一个隐形的按钮来捕抓按键动作:

On ( Key: )
Play
End On

图6. 隐形按钮上的action设置
【译者注】: 该语法为flash4语法,换成flash5以后版本语法如下:

on (keyPress "") {
play();
}


  同样道理,独立播放器里的弹出菜单也应该在开始被禁用:

FS Command ("showmenu", "false")

图7. 禁用弹出菜单的action设置


【译者注】: 该语法为flash4语法,换成flash5以后版本语法如下:

fscommand ("showmenu", "false");

用了以上的设置以后,理论上flash将不会异常停止了。

【译者总结】:

  该项技术应用背景: 背景音效需要多次循环,动画和声音需要保持同步,音质要求高,文件体积要求尽量小的情况下。

  技巧:

  制作动画过程中,可以把所有的声音设置成stream模式,以便调整动画和声音完全匹配。当确声音动画全部匹配以后,再把所有声音设置成event,然后设置nullsound为stream以缩小文件体积。

  有条件的情况下,尽量分割各项音乐元素,提取合并可以循环利用部分,然后利用Flash作为混音器来使用,这样将有效的减少输出文件的大小。