如何在ActionScript 3中播放与SWF不在同一目录中的声音?
我有一个包含SWF外部声音的项目。我想播放它们,但是每当我尝试将新的URL加载到声音对象中时,都会失败,
Error #2068: Invalid Sound
或者引发ioError与
Error #2032 Stream Error
//尝试使用前缀为" http:// .."," file:// .."," // .."和" .."的路径)
var path:String = "http://../assets/the_song.mp3"; var url:URLRequest = new URLRequest( path ); var sound:Sound = new Sound(); sound.addEventListener( IOErrorEvent.IO_ERROR, ioErrorHandler); sound.addEventListener( SecurityErrorEvent.SECURITY_ERROR, secHandler); sound.load(url);
解决方案
除非我们要输入完整的网址,否则请不要使用http://或者file://
声音可以从完整或者相对URL加载mp3文件。我们只需要确保网址正确无误即可。
例如,如果文件的完整路径为http://www.something.com/assets/the_song.mp3,则路径为" /assets/the_song.mp3"。
好吧,我刚刚通过将mp3放在一个目录中进行了测试:" soundTest / assets / song.mp3",然后在另一个目录中创建了一个调用mp3的swf:" soundTest / swfs / soundTest.swf",当我使用var path:String =" ../ assets / song.mp3";
即可编译,没有错误。
实际目录结构是什么?
我们应该真正下载适用于FireFox的httpfox。 SNIFFER使我们可以查看浏览器中正在流动的数据。我们可以看到文件的加载,包括每个文件的路径,甚至可以嗅探POST和GET变量。这将向我们显示从中提取文件的位置,并据此为基础,我们可以相应地修复相对路径。
https://addons.mozilla.org/zh-CN/firefox/addon/6647
重要的:
从SWF调用的所有外部资产都是相对于在Web上加载而不是在SWF上加载它们的html文件。唯一的例外,这是从AS3开始的,FLV是相对于SWF的,而不是像其他所有资产一样加载SWF的HTML文档。这就是嗅探器是一个重要工具的原因,我挠了一下头,直到发现嗅探器中的URL调用了一个奇怪的路径。
以下是如何加载声音的方法。
var soundRequest:URLRequest = "path/to/file.mp3"; var s:Sound = new Sound(soundRequest); var sChannel = s.play(0, int.MAX_VALUE); //Causes it to repeat by the highest possible number to flash. //Above starts the sound immediatly (Streaming); //Now to wait for completion instead, pretend we didnt start it before. s.addEventLister(Event.SOUND_COMPLETE, onSComplete, false, 0, true); function onSComplete(e:Event):void { var sChannel = s.play(0, int.MAX_VALUE); //Causes it to repeat by the highest possible }
在RTMP和HTTP两种协议中,路径均应为-" path / to / mp3:file.mp3"或者" path / to / mp3:file"。我能记住。请同时检查。