HTML5オーディオループ


80

最近HTML5オーディオで遊んでいますが、サウンドを再生することはできますが、再生されるのは1回だけです。何をしようとしても(プロパティ、イベントハンドラーの設定など)、ループさせることができないようです。

これが私が使用している基本的なコードです:

//myAudio is declared at a global scope, so it doesn't get garbage collected.
myAudio = new Audio('someSound.ogg');
myAudio.loop = true;
myAudio.play();

Chrome(6.0.466.0 dev)とFirefox(4 beta 1)を使用してテストしていますが、どちらもループのリクエストを無視して満足しているようです。何か案は?

更新:loopプロパティがすべての主要なブラウザでサポートされるようになりました。


1
Chromeについてはよくわかりませんが、Firefoxはループをサポートしていません。
luiscubal 2010

1
終了したら開始するだけです:myAudio.addEventListener( "ended"、function(e){myAudio.play();}、false);
mattbasta 2010

@ブランドンなぜこれが機能しないのだろうか?このコードと受け入れられた回答の唯一の違いは、受け入れられた回答では、をcurrentTime呼び出す前に0に設定されることplayです。それは必要ですか?
mgiuca 2011年

2
@Brandonはい、kingjeffreyの彼自身の答えに対する2番目のコメントを参照してください。を設定する必要がありますcurrentTime
mgiuca 2011年

これは問題なく機能します(少なくとも今日)
dvlden 2016

回答:


118

一方でloop指定されている、それが実装されていません私が知っているブラウザ Firefox [これを指摘してくれたAnuragに感謝します]。HTML5対応のブラウザで機能するはずのループの代替方法を次に示します。

var myAudio = new Audio('someSound.ogg'); 
myAudio.addEventListener('ended', function() {
    this.currentTime = 0;
    this.play();
}, false);
myAudio.play();

1
うーん...おもしろい。以前はこの方法であまり運がなかったのですが、現在の時刻を設定していませんでした。ただし、これを試してみると、「this.currentTime = 0」の行に「UncaughtError:INDEX_SIZE_ERR:DOMException1」が表示されます
Toji

1
@TojiこれはINDEX_SIZR_ERRエラーのドキュメントです。これは、曲の先頭がブラウザが検索できる範囲外であることを意味します。これは、ブラウザがストリーミングメディアであると判断した場合、またはサーバーに特定の機能がない場合に発生することがあります(この特定の機能が何であるかを忘れてしまいましたが、追跡しようとします)。を使用this.startTimeして、利用可能な最も早い時間に戻ることもできます。
kingjeffrey 2010

@Toji.currentTime必要な理由は、スペックが曲の終わりをどのように処理するかに関係しています。ブラウザは曲を一時停止するだけです。したがって、再生を再開すると、曲の最後で再生が再開されます。再生ヘッドをリセットする必要があります。
kingjeffrey 2010

@Toji.currentTime仕事ができない場合の別の考えです。コールバック関数内ではmyAudio、同じファイルで再宣言して、もう一度再生することができます。再宣言すると、再生ヘッドも曲の先頭にリセットされます。
kingjeffrey 2010

this.startTimeに設定すると同じエラーが発生しますが、サーバーの問題かどうか疑問に思い始めています。ローカルのdjangoサーバーから静的ファイルを提供しています(これはdjangoの最も堅牢な機能ではありません)。それをAnuragが機能するという事実と組み合わせると、おそらく私だけだと思います。もう少しおもちゃにして、結果をお知らせします。
東寺

61

@kingjeffreyと@CMSの提案を組み合わせたアドバイスをさらに追加するには:loop利用可能な場所で使用し、利用できない場合はkingjeffreyのイベントハンドラーにフォールバックできます。loop独自のイベントハンドラーを使用せずに作成するのには十分な理由があります。Mozillaのバグレポートで説明されているように、loop現在、私が知っているどのブラウザーでもシームレスに(ギャップなしで)ループしませんが、それは確かに可能であり、将来的には標準になります。独自のイベントハンドラーは、どのブラウザーでもシームレスになることはありません(JavaScriptイベントループを介してポンプする必要があるため)。したがって、loop独自のイベントを作成するのではなく、可能な場合は使用することをお勧めします。CMSがAnuragの回答に対するコメントで指摘したように、looploop 変数-サポートされている場合はブール値(false)になり、サポートされていない場合は現在Firefoxにあるため、未定義になります。

これらをまとめる:

myAudio = new Audio('someSound.ogg'); 
if (typeof myAudio.loop == 'boolean')
{
    myAudio.loop = true;
}
else
{
    myAudio.addEventListener('ended', function() {
        this.currentTime = 0;
        this.play();
    }, false);
}
myAudio.play();

THX。これはOpera、Firefox、Chromeで完全に機能しました...では、Safari用にサウンド(mp3)を追加するにはどうすればよいですか... ??? (サポートは、OGGやmp3)Chromeの重複原因はおそらくより多くの変数を追加するでしょう...

@pixelassコードでそれを行う方法が完全にはわかりません。HTMLでは、<audio>タグを相互にネストし、ブラウザは一致する最も外側のタグを選択します。プログラマティックAudioオブジェクトでそのネストを実行できるかどうかはわかりません。しかし、あなたは確かにそれを自分でプログラムすることができます:Audio.canPlayTypeメソッドをチェックしてください。
mgiuca 2012年

私はhtmlメソッドを知っています。Audio.canPlayTypeメソッドを試してみるかもしれません。現在、2つの変数を使用しているため、Chromeでは2つのファイルが再生されます。これは私が作ったいくつかの海洋波ループだけなので、実際にはそれほど重要ではありません。...しかし、2つのソースを追加するだけで、はるかに優れたものになります。気になる ならpixelass.com

19

あなたのコードはChrome(5.0.375)とSafari(5.0)で動作します。Firefox(3.6)ではループしません。

例を参照してください。

var song = new Audio("file");
song.loop = true;
document.body.appendChild(song);​

+1とてもかっこいい。私はloopwebkitに実装されていることに気づいていませんでした。
kingjeffrey 2010

10
+1あれば、あなたも検出することができますloopサポートされていることにより、例えば、:typeof new Audio().loop == 'boolean';
クリスチャンC.Salvadó

@CMSはの使用は避けてください==と使用は===、それがパフォーマンスに優れた初心者へのより良い事業者だと。
Klaider 2016

これはFirefox80と互換性がありますか?
MostafizRahman20年

4
var audio = new Audio("http://rho.nu/pub/Game%20Of%20Thrones%20-%20Main%20Theme%20-%20Soundtrack.mp3");

audio.addEventListener('canplaythrough', function() {
    this.currentTime = this.duration - 10;
    this.loop = true;
    this.play();
});

canplaythrougheventlistenerでloop = trueを設定するだけです。

http://jsbin.com/ciforiwano/1/edit?html,css,js,output


4

最も簡単な方法は次のとおりです。

bgSound = new Audio("sounds/background.mp3");
bgSound.loop = true;
bgSound.play();

2

イベントリスナーにjQueryを使用してみてください。そうすれば、Firefoxで機能します。

myAudio = new Audio('someSound.ogg');

$(myAudio).bind('ended', function()  {
    myAudio.currentTime = 0;
    myAudio.play();
});

myAudio.play();

そんな感じ。


1

私はこのようにしました、

<audio controls="controls" loop="loop">
<source src="someSound.ogg" type="audio/ogg" />
</audio>

こんな感じです

ここに画像の説明を入力してください


0

これは機能し、上記の方法を切り替えるのははるかに簡単です。

インラインで使用: onended="if($(this).attr('data-loop')){ this.currentTime = 0; this.play(); }"

によってループをオンにします。によって$(audio_element).attr('data-loop','1'); ループをオフにします。$(audio_element).removeAttr('data-loop');


0

サウンドの正確な長さがわかっている場合は、setIntervalを試すことができます。setIntervalにx秒ごとにサウンドを再生させることができます。Xはサウンドの長さになります。


これは質問に対する答えを提供しません。著者に批評したり、説明を求めたりするには、投稿の下にコメントを残します。自分の投稿にいつでもコメントできます。十分な評判得られたら、どの投稿にもコメントできます。
Alex Char

4
@AlexChar私は同意しません。これは少なくとも質問に答える試みです。コードがどのように見えるかを正確に示すために拡張することでメリットが得られる可能性があり、問題を解決する最善の方法ではない可能性がありますが、「答えではありません」。
Anthony Grist 2015年

そうすることで、経験上の問題が発生します。
Klaider 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.