2013-01-24 85 views
1

我有一個類AudioClass在JavaScript中播放音頻如下:(僞代碼)HTML5音頻有時不能加載

var AudioClass = function() { 
    this.audioElement; 
    . 
    . 
    . 
    this.load = function(audioSource) { 
     this.audioElement = //create Audio, set source etc. 
     this.audioElement.addEventListener("loadedmetadata", function(){ 
       //some code 
     }); 
    } 

    this.play = function(from, to) { 
     if(isNaN(this.audioElement.duration)) { return; } //line 1 
     this.audioElement.currentTime = from/1000; //line 2 //from & to in milliseconds 
     setTimeout(function() { 
       //pause audio. 
     }, to-from); 
    } 
} 

,我使用了Audio如下:

/* the below lines are executed on document load. (playing background music) */ 
var audioInstance = new AudioClass(); 
audioInstance.load(audioSrc); 
audioInstance.play(20000); //line 3 //20 seconds 

/* the below line is used at other places whenever i need sound */ 
audioInstance.play(40000); //40 seconds 

當我我試圖在「第3行」播放音頻,有時音頻不會在那段時間加載,所以它會投擲INVALID_STATE_ERR. DOM EXCEPTION 11 at line 2。當我檢查音頻持續時間時,它是NaN。因此,我添加了「第1行」來檢查持續時間是否爲isNaN(),以便它在加載音頻之前不嘗試設置currentTime

這裏的問題有時音頻的持續時間總是NaN。如何解決這個問題?

+0

FWIW:'Audio'是本地HTML5音頻對象的名稱。對於您的自定義對象,選擇其他名稱是有意義的。 –

+1

你不等待音頻加載,創建一個回調來播放它時,它完成加載 –

+0

@Marat Tanalin我沒有完全使用「音頻」。這是一個僞代碼。 –

回答

1

您必須創建回調才能在加載音頻時播放音頻。它可以在任何時候在其他地方調用audio.play時發揮作用,因爲當時音頻已加載。這裏是我建議你這樣做:

var Audio = function() { 
    this.audioElement; 
    . 
    . 
    . 
    this.load = function(audioSource,callback) { 
     this.audioElement = //create Audio, set source etc. 
     this.audioElement.addEventListener("loadedmetadata", function(){ 
       //some code 
       if(callback!=null) 
        callback(); 
     }); 
    } 

    this.play = function(from, to) { 
     if(isNaN(this.audioElement.duration)) { return; } //line 1 
     this.audioElement.currentTime = from/1000; //line 2 //from & to in milliseconds 
     setTimeout(function() { 
       //pause audio. 
     }, to-from); 
    } 
} 

然後使用它是這樣的:

var audio = new Audio(); 
audio.load(audioSrc,function() 
{ 
audio.play(20000); 
}); 

回答類似的問題顯示瞭如何預加載所有的音頻(你有別人的情況下)前開始使用它們: Proper onload for <audio>

0

播放聲音在註冊到loadeddata甚至更​​好,則audiocanplaythrough事件的回調。 (請參閱javascript audio onload及類似問題。)