4

Youtube Javascript APIを使用して、ウェブサイトに埋め込まれたビデオを読み込んで再生しています。

ユーザーが再生、一時停止などをクリックすると、これらの状態を表す整数があります。例えば:

YT.PlayerState.ENDED
YT.PlayerState.PLAYING
YT.PlayerState.PAUSED
YT.PlayerState.BUFFERING
YT.PlayerState.CUED

早送りのために送信される状態メッセージは何ですか?

早送りと言うときは、ビデオ タイマーをドラッグしてビデオを進めたり、ビデオのポイントに戻したりすることを意味します。

誰かが早送りしていることを検出する方法を知っていますか?

*編集: *
さらに調査した結果、タイム バーをドラッグすると、YT.PlayerState.PAUSED というメッセージが送信されることがわかりました。ユーザーがビデオを一時停止すると、ビデオが元のサイズに縮小されるため、これは大きな問題です。しかし、早送りは一時停止と同じメッセージを送信するため、誰かが早送りを行うとビデオが縮小されますが、これは想定外のことです。

一時停止と早送りを区別する方法はありますか?

4

4 に答える 4

6

ユーザーが「早送り」またはトラックするときにイベントが送信されないようです。そこで、早送りを検出する独自の方法を思いつきました。

  • 複数の PAUSE イベントが連続してディスパッチされる場合: ユーザーは「追跡中」(早送り) です。
  • PAUSE イベントが 1 つだけディスパッチされた場合、ユーザーは一時停止しています。
<script>
    var PAUSE_EVT_STACK = 0;

    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PAUSED)
            PAUSE_EVT_STACK++;
        if (event.data == YT.PlayerState.PLAYING)
            PAUSE_EVT_STACK = 0;

        if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK <= 1)
            console.log("Pause pressed");
        else if (event.data == YT.PlayerState.PAUSED && PAUSE_EVT_STACK > 1) {
            console.log("Tracking occuring");
            console.log("Hey! Dont fast forward during my ad you douche");
        }
    }

  function loadYouTubeVideo(uid) {
    setTimeout( function() {
        var instPlayer = new YT.Player(uid, {
            height: 480,
            width: 853,
            enablejsapi: 1,
            suggestedQuality: 'highres',
            videoId: uid,
            events: {
                    'onStateChange': onPlayerStateChange
            }
        });
    }, 500);
  }
</script>
于 2013-06-28T04:44:17.463 に答える
1

Jake M の方法を使用しようとしてもうまくいかないことがわかりました。API が変更されたためかどうかはわかりませんが、ロジックに従って、コンソールで作業すると、ロジックは常に早送りトリガーに到達する前に一時停止します。

そして奇妙なことに、しばらくして早送りしようとすると、複数回ではなく、一度だけ一時停止していました。

これは非同期の状況 (プレイヤー イベントの待機) であるため、考慮に入れる時間がかかる外部ビューアー メソッドからアプローチするのが最善であることがわかりました。 2 番目は、プレイヤーが現在プレイしているかどうかを確認します。

最初のチェックの 0.8 秒後にチェックを行うと、プレーヤーは一時停止するか再生するかを判断するのに十分な時間を与えられます。

var check = false;
var playing = false;
function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
        slider.startStop(false);
        playing = true;
    } else if (event.data == YT.PlayerState.PAUSED) {
        playing = false;
        pauseCheck();
    } else if (event.data == YT.PlayerState.ENDED) {
        slider.goForward();
        slider.startStop(true);
    }
}

function pauseCheck() {
    // First time check is a "wait".
    if(!check) {
        check = true;
        setTimeout(pauseCheck, 800);
    // Second time check to determine true status.
    } else {
        // This means we fast-forwarded or rewound.
        if(playing) {
            // DO FF / RW THINGS.
        // This means we really did want to pause.
        } else {
            // DO PAUSE THINGS
        } 
        check = 0;
    }
}
于 2017-07-18T20:53:36.870 に答える
0

トラッキングが PAUSE イベントを受信しなくなり、BUFFERING イベントが発生してから PLAY イベントが発生することがわかりました。

YouTube ビデオを最後まで (一時停止または追跡なしで) 再生するときに発生するイベントの順序は次のとおりです。

バッファリング -> 再生 -> 終了

ユーザーが少なくとも 1 回追跡する場合、発生するイベントは次のようになります。

BUFFERING -> PLAY [they track] -> BUFFERING -> PLAY -> ENDED

ここでの明らかな注意点は、接続または処理の問題のためにビデオが実際にバッファリングされている場合の誤検知です。これを調整してテストしましたが、私の環境では実際に誤検知はありませんでした。

于 2015-03-16T22:04:53.397 に答える