如何在 Actionscript 3 中播放与 SWF 不在同一目录中的声音?
Posted
技术标签:
【中文标题】如何在 Actionscript 3 中播放与 SWF 不在同一目录中的声音?【英文标题】:How to play a sound in Actionscript 3 that is not in the same directory as the SWF? 【发布时间】:2010-09-11 14:50:15 【问题描述】:我有一个项目,其中包含一堆 SWF 的外部声音。我想播放它们,但每当我尝试将新 URL 加载到声音对象中时,它都会失败,
错误 #2068:声音无效
或使用
引发 ioError错误 #2032 流错误
// 尝试使用前缀为“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);
【问题讨论】:
【参考方案1】:除非您要放置完整的 url,否则不要使用 http:// 或 file://
声音可以从完整或相对 url 加载 mp3 文件。您只需要确保您的网址正确且有效。
例如,如果文件的完整路径是 http://www.something.com/assets/the_song.mp3,则路径为“/assets/the_song.mp3”即可。
【讨论】:
对不起,我在顶部的示例中不清楚。如果我尝试您对 path = "../assets/the_song.mp3" 的建议,我会收到“错误 #2068:无效声音”的错误。 (我也刚刚尝试了“/../assets/the_song.mp3”,导致同样的错误。)【参考方案2】:好吧,我刚刚做了一个测试,将一个 mp3 放在一个目录中:soundTest/assets/song.mp3
然后在另一个目录中创建一个调用 mp3 的 swf:soundTest/swfs/soundTest.swf
,当我使用 var path:String = "../assets/song.mp3";
时,它编译时没有错误。
你的实际目录结构是什么?
【讨论】:
我也没有任何编译时错误,但是当我尝试以下任一操作时出现运行时错误(并且声音不播放):path = "http:// /../assets/the_song.mp3" // ioErrorEvent, Error #2032 Stream Error path = "../assets/the_song.mp3" // Error #2068: Invalid Sound 请注意,这是两个样本,看起来退货没有放入 cmets。只是想强调我收到的是运行时错误,而不是编译时错误。 嗯,我也没有收到任何运行时错误。我的示例代码和您的示例代码之间的唯一区别是我没有监听任何 IO 或安全错误。你能把那些剥掉的试试看吗? 我在做这个测试时意识到我需要把 MP3 移回原处。在它工作之后,我尝试重新添加安全事件,它也工作得很好。这是有道理的……因为没有流,所以出现了流错误。谢谢。【参考方案3】:你真的应该为 FireFox 下载 httpfox。此 SNIFFER 允许您查看哪些数据正在流经浏览器。你可以看到它加载的文件,包括每个文件的路径,你甚至可以嗅探 POST 和 GET 变量。这将向您显示文件是从哪里提取的,并据此您可以相应地修复您的相对路径。
https://addons.mozilla.org/en-US/firefox/addon/6647
重要:
从 SWF 调用的所有外部资源都与加载到 Web 时加载它们的 html 文件相关,而不是 SWF。唯一的例外,这是从 AS3 开始的,FLV 与 SWF 相关,而不是像其他所有资源一样加载 SWF 的 HTML 文档。这就是为什么 SNIFFERS 是一个重要的工具的原因,我挠了挠头,直到我注意到 sniffer 中的 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
【讨论】:
【参考方案4】:在 RTMP 和 HTTP 协议中,路径应该是 -- "path/to/mp3:file.mp3" 或 "path/to/mp3:file"。我能记住。请检查两者。
【讨论】:
以上是关于如何在 Actionscript 3 中播放与 SWF 不在同一目录中的声音?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 actionscript 3.0 中为音乐播放器创建 EASY 自定义搜索栏
在 Actionscript / Flex 3 中播放嵌入式 mp3 之前的延迟
如何在 ActionScript 3 中从缓冲区 (ByteArray/Stream) 播放 MP3 声音?
如何创建由 xml 文件驱动的 Adobe Flash cs6 Actionscript 3 rtmp 视频播放器?