10

MOD フォーマットについて私が最も気に入っている点の 1 つは、曲の任意のポイントにループバックできることです。これにより、「イントロ」の後に「メイン ループ」が続く曲に最適です。

もちろん、MP3 ではこれができません。

今まで、私は次のようなことをしてきました。

<audio src="/path/to/song.mp3" onEnded="this.currentTime = 12.345;"></audio>

float 値は、メイン ループの開始時刻です。

これが機能している間、オーディオが再開する際に数分の 1 秒の顕著な一時停止があります。目標時間を本来あるべき場所よりも少し前に設定することで、この一時停止の影響を軽減できます。これにより、ビートは少なくとも時間的に近く保たれますが、実際には理想的ではありません.

私が考えることができる主な代替手段は、オーディオファイルを手動でループして(たとえば、Audacityでコピーアンドペーストして)、必要とされる可能性が最も高い曲よりも長い曲を作成することですが、問題はそれが結果として生じることですハード ドライブの容量と帯域幅が無駄に消費されるため、曲を気に入って長時間聴くのをやめてしまうという問題は解決しません。

それで、MP3 ストリームをループする方法があるかどうか疑問に思っていました。形式を正しく理解していれば、ファイル内のどの位置 (バイト単位) でメイン ループが開始するか (秒単位) を判断できるはずなので、理論上は無期限にループするストリームを構築できます。しかし、そのようなストリームは HTM5 オーディオでサポートされますか?

4

1 に答える 1

1

毎回遅延を測定してみてください。

function playSeamless(clip, next) {
    if(!next) {
        next = clip.cloneNode(true);
        next.controls = false;
    }

    var start = Date.now();
    clip.play();

    setTimeout(function() {
        var time = (Date.now() - start) / 1000;
        var position = clip.currentTime;
        var delay = time - position;

        setTimeout(function() {
            // Set desired currentTime on next here and adjust delay above
            playSeamless(next, clip);
        }, (clip.duration - clip.currentTime - delay * 2.35) * 1000 | 0);
    }, 200);
}

playSeamless(yourAudioClip);

良くなりましたが、完全に正確というわけではないので、調整する* 2.35か、引き算か何かにする必要があります。

于 2013-06-24T20:09:02.740 に答える