我要做的是以歌曲持续时间的形式显示歌曲下载进度。例如: 00:00,01:05,02:14,03:58,...... 04:13 04:13 歌曲总持续时间。到目前为止我有这个代码:
var soundClip:Sound;
var sTransform:SoundTransform = new SoundTransform(0.1);
function init() {
soundClip = new Sound();
soundClip.load(new URLRequest("magneto.mp3"));
//soundClip.load(new URLRequest("making.mp3"));
soundClip.addEventListener(Event.COMPLETE, soundLoaded);
soundClip.addEventListener(ProgressEvent.PROGRESS, soundLoading);
}
init();
function convertTime(millis:Number):String{
var displayMinutes:String;
var displaySeconds:String;
var Minutes:Number = (millis % (1000*60*60)/(1000*60));
var Seconds:Number = ((millis % (1000*60*60)) % (1000*60))/1000;
if(Minutes<10){
displayMinutes = "0"+Math.floor(Minutes);
}else{
displayMinutes = Math.floor(Minutes).toString();
}
if(Seconds<10){
displaySeconds = "0"+Math.floor(Seconds);
}else{
displaySeconds = Math.floor(Seconds).toString();
}
return displayMinutes + ":" + displaySeconds;
}
function soundLoaded(e:Event) {
soundClip.play(0,0,sTransform);
}
function soundLoading(e:ProgressEvent) {
trace(convertTime(soundClip.length));
}
正如你所看到的,我正用两首歌来测试它,根据上面的代码,两者的持续时间分别是:03:52和11:28,但根据窗口,这两首歌是03:52 05:44。 Here是代码和两个mp3文件。
谢谢。
编辑:我正在分析这个page播放歌曲制作.mp3,在重新调整之后我意识到有一个传递给播放器的值,并且这样: 0, 0,2664,7576,... 344370 这些值显示为* 00:00,01:05,02:14,03:58,...... 04:13 *作为下载进度。知道这些数据来自哪里可以解决我的问题,最初我认为它可能是长度的,但这只适用于magto.mp3文件而不是两首歌。总的来说,我想表明:
00:00,00:23,01:23 ... 03:57(其中03:57是任何歌曲的持续时间)作为下载进度。
感谢您帮助我。干杯:)
答案 0 :(得分:0)
您的代码没有问题,您的技术也是正确的。
您只需要在下载结束时获取总持续时间。检索到更多数据时,文件长度的值会发生变化。如果下载在到达结束之前停止,则只有不完整文件的长度。添加另一个处理程序可能会检查错误,如果触发,让用户知道文件下载仍然不完整。
更新:我明白了。在convertTime()
方法中添加对soundLoaded()
的调用。
正在发生的是在PROGRESS事件处理程序中更新文件长度。但最终长度通常仅在COMPLETE事件中可用,因为PROGRESS事件处理程序仅在文件下载不完整时调用,而不是在文件下载完成后调用。
将convertTime()
调用保持在PROGRESS事件处理程序中,就像现在一样。
private function soundLoaded(e:Event):void
{
soundClip.play(0, 0, sTransform);
trace(convertTime(soundClip.length));
}
这应该这样做。
更新2:这是许多论坛在线报道的已知问题。在下载过程中,报告的采样频率小于44 khz的声音文件长度不正确。只有在下载完成后才会报告正确的持续时间。这仅影响版本9或更低版本的SWF文件。
将输出SWF更改为版本10+可解决此问题。