1

[youtube api][1] を使用して、ビデオが完全にバッファリングされたことを確認していますplayer.getVideoLoadedFraction()

分数が 1 の場合、ビデオは完全にバッファリングされますが、この関数をポーリングして 1 かどうかを確認し、次のように時間を取得する必要があります。

setInterval(display_fraction,1);

ビデオは数十分になる可能性があるためです。

このポーリングはブラウザ/クライアントに大きな負荷をかけ、ビデオ ストリーミングに影響を与えますか? YouTubeがバッファリングを終了したことを検出するための他のより良いポーリング方法または方法はありますか?

ところで、YouTube API のリンクは次のとおりです: https://developers.google.com/youtube/flash_api_reference#Playback_controls

4

2 に答える 2

4

人間は 1 秒の 20 秒から 10 分の 1 の間のどこかで時間間隔を認識し始めるため、1 ミリ秒の値でポーリングを試みることは必要でもありませんし、望ましいことでもありません (最新のブラウザーはとにかく 5 ミリ秒または 10 ミリ秒に切り上げます)。50 や 100 などの値がより適切です。

また、次のような呼び出しsetTimeoutではなく、連鎖した一連の呼び出しを使用することを強くお勧めします。setInterval

function onVideoReady(callback) {

    // Do first check as soon as the JavaScript engine is available to do it
    setTimeout(checkVideoReady, 0);

    // Our check function
    function checkVideoReady() {
        if (videoIsReady) {
            // The video is ready, notify calling code
            callback();
        }
        else {
            // Not ready yet, wait a 10th of a second
            setTimeout(checkVideoReady, 100);
        }
    }
}

...次のように使用します。

onVideoReady(function() {
    // The video is ready, do something
});

setTimeoutの代わりに連鎖シリーズを推奨する理由は次のsetIntervalとおりです。

  1. 繰り返しごとに遅延を簡単に変更できます。たとえば、上記の例では、最初はできるだけ早くチェックを起動し、その後は毎回 100 ミリ秒後にチェックを起動します。それよりもタイミングでより複雑なことを行うことができます。柔軟性があります。

  2. コードは次のループを明示的にトリガーする必要があるため、うっかり複数回実行してしまうことははるかに困難です。

  3. setInterval最後の呼び出しの開始からインターフェイスを測定するか、呼び出しの終了からインターフェイスを測定するかについては、ブラウザーによって異なります。上記のようなパターンを使用すると、最後のチェックの最後からのものであることが常に確信できます。

  4. 次の間隔が発生する予定のときにコードがまだ実行されている場合は、スキップされます。これにより、少なくとも一部のブラウザーではギャップが発生する可能性があります (たとえば、100 ミリ秒ごとに何かを実行していて、前のループが完了するまでに 102 ミリ秒かかる場合、次のループはできるだけ早く開始されず、残りの 98 ミリ秒を待機します)。

もちろん、それはあなた次第です。上記は、一連の呼び出しと同じようにsetIntervaland呼び出しでも簡単に実行できます。clearIntervalsetTimeout

于 2012-11-05T12:05:22.410 に答える
1

チェーン化されたタイムアウトの代替は、チェーン化されたPromisesです。以下は、タイムアウトとともに定期的なポーリングを実装します。

var Promise = require('bluebird');

/**
 * Periodically poll a signal function until either it returns true or    a timeout is reached.
 *
 * @param signal function that returns true when the polled operation is complete
 * @param interval time interval between polls in milliseconds
 * @param timeout period of time before giving up on polling
 * @returns true if the signal function returned true, false if the operation timed out
 */
function poll(signal, interval, timeout) {
    function pollRecursive() {
        return signal() ? Promise.resolve(true) : Promise.delay(interval).then(pollRecursive);
    }

    return pollRecursive()
        .cancellable()
        .timeout(timeout)
        .catch(Promise.TimeoutError, Promise.CancellationError,function () {
            return false;
        });
}

あなたはそう呼んでいます。

poll(isVideoReady, pollingInterval, timeout).then(console.log);

promises を使用した Javascript ポーリングを参照してください。

于 2015-07-04T20:30:41.283 に答える