1

以下のようにオーディオを再生するためのjavascriptのクラスがありAudioClassます:(疑似コード)

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 になる場合があることです。これを修正する方法は?

4

2 に答える 2

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);  
});

同様の質問への回答は、使用を開始する前にすべてのオーディオ (他のオーディオがある場合) をプリロードする方法を示しています: <audio> の適切なオンロード

于 2013-01-24T16:24:43.000 に答える
0

要素のイベントloadeddataまたはさらに良いことに登録されたコールバックでサウンドを再生します。( javascript audio onloadおよび同様の質問を参照してください。)canplaythroughaudio

于 2013-01-24T16:26:26.520 に答える