Actionscript 3 从flash Sound对象获取响应状态代码
我有一个音乐播放器,可以下载和播放音乐(下载时应该播放),目前我的代码如下:Actionscript 3 从flash Sound对象获取响应状态代码,actionscript-3,flash,Actionscript 3,Flash,我有一个音乐播放器,可以下载和播放音乐(下载时应该播放),目前我的代码如下: sound = new Sound(new URLRequest(url_stream)); var sound:Sound; var request:URLRequest = new URLRequest('http://www.example.com/file.mp3'); var loader:URLLoader = new URLLoader(); var httpCode:int; loader.dataF
sound = new Sound(new URLRequest(url_stream));
var sound:Sound;
var request:URLRequest = new URLRequest('http://www.example.com/file.mp3');
var loader:URLLoader = new URLLoader();
var httpCode:int;
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,loaderStatus);
loader.addEventListener(Event.COMPLETE,loaderComplete);
function loaderStatus(evt:HTTPStatusEvent):void {
httpCode = evt.status;
}
function loaderComplete(evt:Event):void {
if (httpCode == 200) {
ba:ByteArray = loader.data as ByteArray;
sound = new Sound();
sound.loadCompressedDataFromByteArray(ba,ba.length);
sound.play();
}
}
有时服务器返回404(找不到)和429(请求太多)状态码而不是音乐文件,我正在寻找一种方法来找出响应状态码,以防出现播放错误,有什么想法吗?要获得响应状态,您可以使用
HTTPStatusEvent
事件和URLLoader
如下:
var sound:Sound
var request:URLRequest = new URLRequest('http://www.example.com/file.mp3')
var loader:URLLoader = new URLLoader()
loader.addEventListener(
HTTPStatusEvent.HTTP_STATUS,
function(event):void {
trace('http status: ' + event.status)
if(event.status == 200){
sound = new Sound(request)
sound.play()
}
}
)
loader.addEventListener(IOErrorEvent.IO_ERROR, function(){})
loader.load(request)
此代码100%正常工作。在akmozo的解决方案中,您需要下载两次MP3。首先查看服务器上是否存在该文件,然后再次在声音中播放该文件。最好这样做:
sound = new Sound(new URLRequest(url_stream));
var sound:Sound;
var request:URLRequest = new URLRequest('http://www.example.com/file.mp3');
var loader:URLLoader = new URLLoader();
var httpCode:int;
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,loaderStatus);
loader.addEventListener(Event.COMPLETE,loaderComplete);
function loaderStatus(evt:HTTPStatusEvent):void {
httpCode = evt.status;
}
function loaderComplete(evt:Event):void {
if (httpCode == 200) {
ba:ByteArray = loader.data as ByteArray;
sound = new Sound();
sound.loadCompressedDataFromByteArray(ba,ba.length);
sound.play();
}
}
虽然如果URLRequest被缓存,它可能不会被下载两次。这是肯定的,但正如我提到的,音频文件应该在下载时播放,但是您的代码“加载器”会在我播放之前下载整个文件,我错了吗?