如何在 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 文件驱动的 Adob​​e Flash cs6 Actionscript 3 rtmp 视频播放器?

使用 ActionScript 3 从 Air 中的麦克风查找活动时,如何忽略应用程序播放的声音?

ActionScript 3.0复杂的mp3播放器[关闭]