11

タイトル参照。オーディオ ファイルを 300 ミリ秒ごとに 4 回連続して再生しようとしています。ただし、クリップは 300 ミリ秒より長いため、クリップの再生が完了するまで、新しい再生要求は無視されます。300ms ごとにクリップを停止して再開する方法を探しています。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
</head>
<body>
    <audio id="note0440"><source src="0440.a4.wav" type="audio/wav"></audio>
    <script type="text/javascript">
        function playNote (loop) {
            var n = document.getElementById("note0440")
            if (loop > 4)
                return
            n.volume = 0.05
            // n.currentTime = 0
            n.pause()
            n.play()
            setTimeout("playNote("+(loop + 1)+")", 300)
        }
    </script>
    <div style="margin:50px"><button onclick="playNote(1)">Play Note</button></div>
</body>
</html>

これは動作しません。使用の有無にかかわらず、停止および再始動しませんn.currentTime = 0

テスト用に必要な場合は、次の WAV ファイルを参照してください: http://popstrip.com/misc/0440.a4.wav

4

4 に答える 4

32

ストップを呼び出す場所はどこでも、次の順序で実行してください -

 n.pause();
 n.currentTime = 0;
 n.play();      
于 2012-11-06T02:02:48.567 に答える
3

仕様のセクション 4.8.10.6 から

メディア。duration メディア リソースの開始が時間ゼロであると仮定して、メディア リソースの長さを秒単位で返します。

期間が利用できない場合は NaN を返します。

無制限のストリームの場合は Infinity を返します。

メディア。currentTime [ = value ] 公式の再生位置を秒単位で返します。

指定された時間にシークするように設定できます。

選択されたメディア リソースがない場合、または現在のメディア コントローラーがある場合は、InvalidStateError 例外をスローします。

そのため、仕様では 1 秒未満のシークは許可されていません。ただし、ブラウザが異なれば、実装方法も異なります (もちろん)。一部のブラウザーこれをサポートしている可能性がありますが、現在展開されているすべてのブラウザーで確実に動作するようにすることは、非常に困難です。ミリ秒のシークを発行できると仮定すると、もう 1 つの問題は、js インタープリターが要求を時間内に実行できない可能性があることです。つまり、シークの処理にシークの値よりも時間がかかり、他の問題が発生する可能性があります。

シークに 1 秒未満の粒度が本当に必要な場合は、当面は html5 アプローチを放棄し、可能であればホスト上でネイティブに実行されるプラグインまたはコードを使用することをお勧めします。

于 2012-11-06T02:01:14.810 に答える