0

それぞれがビデオのコレクションを表示している一連のページがあります。もしそうなら、一種のビデオプレイリスト。各動画に簡単に対処できるようにするために、動画で mediaelement.js プラグインを実行し、次のように mediaElement オブジェクトを配列に格納します。

var mediaArray = [];
$(".class").each(function (index) {
    $(this).mediaelementplayer({
        success: function (mediaElement, domObject) {
            mediaArray[index] = mediaElement;
        }
    });
});

これは、さまざまな mediaElement オブジェクトに対応する mediaelement.js プレーヤーの外部にあるコントロールを使用できるようにするのに最適です。たとえば、次のビデオのタイトルをクリックして、そのビデオの再生に切り替えることができます。

問題が発生するのは、ユーザーがいずれかのビデオの音量を変更できるようにし、次のビデオの再生を開始したときにその音量を維持しようとしたときです。

次のような関数を簡単に書くことができます。

    setAllVolume = function (value) {
        for (var i=0, il=mediaArray.length; i<il; i++) {
            mediaArray[i].setVolume(value);
        }
    }

mediaelement.js コントロールの外側にボリューム コントロールがある場合、これはうまく機能します。(たとえば、ユニバーサル ボリューム コントロール用の jQueryUI スライダーを作成するとします。)

私が試したのは、「changevolume」イベントのイベントリスナーを追加して、次のsetAllVolumeように関数を起動させることです:

$(".class").each(function (index) {
    $(this).mediaelementplayer({
        success: function (mediaElement, domObject) {
            mediaArray[index] = mediaElement;
            mediaElement.addEventListener("volumechange", function () {
                setAllVolume(mediaElement.volume);
            });
});

ご想像のとおり、この方法でボリュームを設定すると、各 mediaElement が独自の「volumechange」イベントをsetAllVolume発生させ、カスケード フェイル パイルで関数を再帰的に呼び出します。これにより、ブラウザが何度も何度もプロセスをかき回してハングアップします。

では、この再帰に遭遇することなく、あるビデオの音量を他のビデオに反映させる方法はありますか? (私は H.264 ビデオを使用しており、この問題は Flash プラグインを使用してその形式を再生するブラウザでのみ発生するようです。)

4

1 に答える 1

0

私の問題に対する最も簡単な解決策は、配列をループするときに保存されている mediaElement の現在のボリュームをチェックすることだと思います。

setAllVolume = function (value) {
    for (var i=0, il=mediaArray.length; i<il; i++) {
        if (mediaArray[i].volume !== value) {
            mediaArray[i].setVolume(value);
        }
    }
}
于 2013-02-06T17:04:35.923 に答える