我这里有一个小小的声音流脚本,但有时如果你在当前加载之前按下播放到下一首曲目,则下一首曲目不会加载
package player {
import flash.events.Event;
import flash.display.Sprite;
import flash.external.ExternalInterface;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import player.Loader_bar;
public class Stream extends Sprite {
private var _Sound = null;
private var _Channel = null;
private var isLoading = false;
private var _Loader_bar = null;
public var loader_color = null;
public var loader_width = 0;
public var loader_height = 0;
private var i = 0;
public function Stream(){
this._Loader_bar = new Loader_bar();
addChild(this._Loader_bar);
}
public function cnstr(){
this._Loader_bar.color = this.loader_color;
this._Loader_bar.w = this.loader_width;
this._Loader_bar.h = this.loader_height;
this._Loader_bar.cnstr();
}
public function play(url){
this.stop();
this.close();
this._Sound = new Sound();
this.isLoading = true;
this.addEventListener(Event.ENTER_FRAME, listener_bytesLoaded);
this._Sound.addEventListener(Event.COMPLETE, listener_loadedComplete);
this._Sound.load(new URLRequest(url));
this._Channel = this._Sound.play();
}
public function stop(){
if(this._Channel){
this._Channel.stop();
}
}
private function close(){
if(this.isLoading){
this._Sound.close();
}
}
private function listener_loadedComplete(event){
this.close();
this.isLoading = false;
this.removeEventListener(Event.ENTER_FRAME, listener_bytesLoaded);
}
private function listener_bytesLoaded(event){
var float = this._Sound.bytesLoaded / this._Sound.bytesTotal;
this._Loader_bar.progress(float);
var data = {
i : this.i,
float : float,
loaded : this._Sound.bytesLoaded,
total : this._Sound.bytesTotal
};
ExternalInterface.call('swf2js', 'tst_progress', data);
this.i++;
}
}
}
答案 0 :(得分:1)
接近():无效 关闭流,导致任何数据下载停止。
试试这个:
创建一个类似 hasLoaded 的布尔值,将其设置为false。成功加载声音后,将其设置为true。
然后,当您播放声音时,您可以在 play()功能中测试 hasLoaded 。如果您在加载上一个声音之前调用 play(),则 hasLoaded 将为false,在这种情况下,您调用 this._Sound.close()在创建和加载新声音之前。测试而不是仅仅调用 close()的原因是,如果您暂停了流,则无需重新加载它以再次播放它。
此外:
关于未正确报告的负载,您的进度逻辑设置不正确。试试这个:
1)import flash.events.ProgressEvent
2)对于监听器,替换this.addEventListener(Event.ENTER_FRAME,listener_bytesLoaded);在你的play()方法中使用this._Sound.addEventListener(ProgressEvent.PROGRESS,listener_bytesLoaded);
3)将listener_bytesLoaded()方法更改为以下内容:
private function listener_bytesLoaded(event:ProgressEvent)
{
var percent = event.bytesLoaded / event.bytesTotal;
this._Loader_bar.progress(percent);
var data = {
i : this.i,
float : percent,
loaded : event.bytesLoaded,
total : event.bytesTotal
};
ExternalInterface.call('swf2js', 'tst_progress', data);
this.i++;
}
4)更改this.removeEventListener(Event.ENTER_FRAME,listener_bytesLoaded); 在你的listener_loadedComplete()方法中的this._Sound.removeEventListener(ProgressEvent.PROGRESS,listener_bytesLoaded);然后将其移出该方法并将其放在close()方法中的条件内。
注意 - 我实际上并没有编译它,但我觉得很好。希望有所帮助。 :)