Ошибка Safari 11/YouTube API. Быстрая игра/пауза и отказ автозапуска

Это только что началось с того, что мне сообщили пользователи. Я потратил кучу времени на изучение моего собственного кода на наличие ошибок, но похоже, что он относится к Safari 11 (новейший).

При использовании простого примера API IFrame Embed API, Safari будет быстро переключаться между состояниями воспроизведения и паузой, пока не закончится пауза.

Это не самая оптимизированная версия примера, потому что здесь было какое-то исследование, что могло бы заставить его работать. Я хотел пропустить вперед и автовоспроизвести, но это не сработало бы так, как предполагалось. Я попытался использовать start и playVideo, которые являются документами YT API.

Я только недавно подтвердил это как ошибку, которая объясняет, почему в примере есть несколько подробных параметров.

Примечания:

  • Иногда видео будет играть в зависимости от того, сколько раз вы обновляете, но это очень редко.
  • Флаги автовоспроизведения обычно терпят неудачу.
  • Используя флаг start в этом примере, чтобы пропустить вперед, потому что startSeconds не работал.
  • Пример кода работает в других браузерах: Chrome, Opera, Firefox

Вот изображение того, что вы можете увидеть в консоли Safari, в котором показана паника состояния игрока, в конечном итоге приземлившись на 2 (приостановлено). Паника в консоли

Вот пример кода копирования/вставки, который будет реплицировать ошибку. Отбросьте его в любом HTML файле, и вы увидите, что он не работает в Safari 11.

<style>
    body, html, iframe {
        position: absolute; left: 0; right: 0; top: 0; bottom: 0; width: 100%; height: 100%;
        margin: 0;
        padding: 0;
        pointer-events: none;
    }
</style>


<script>
    var videoId = "9nwQ1F7oX-8";

    var playerVars = {
        autohide: 1,
        autopause: 0,
        autoplay: 1,
        cc_load_policy: "0",
        disablekb: 1,
        enablejsapi: 1,
        iv_load_policy: 1,
        modestbranding: 1,
        origin: "*",
        rel: 0,
        showinfo: 0,
        start: 122,
        version: 3
    };
</script>


<iframe id="ytplayer"
    frameborder="0"
    allowfullscreen="1"
    title="YouTube video player"
    width="100%"
    height="100%"
    x-src="https://www.youtube.com/embed/9nwQ1F7oX-8?enablejsapi=1&amp;origin=*&amp;rel=0&amp;version=3&amp;iv_load_policy=3&amp;modestbranding=1&amp;showinfo=0&amp;autohide=1&amp;disablekb=1&amp;autoplay=1&amp;autopause=0&amp;cc_load_policy=0&amp;startSeconds=30&amp;widgetid=1"
    src="https://www.youtube.com/embed/9nwQ1F7oX-8?enablejsapi=1&amp;origin=*&amp;start=122">
</iframe>


<script>
window.onYouTubeIframeAPIReady = function() {
    console.log("YouTube is ready!", videoId, playerVars);

    var api = new YT.Player("ytplayer", {
        width: "100%",
        height: "100%",
        videoId: videoId,
        playerVars: playerVars,
        events: {

            onError: function(e) {
                // 100 â€" The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.
                // 101 â€" The owner of the requested video does not allow it to be played in embedded players.
                // 150 â€" This error is the same as 101. It"s just a 101 error in disguise!

                console.warn("An error has occurred", arguments);
            },

            onReady: function() {
                // log
                console.log("YouTube player is ready to use");

                //
                api.playVideo();
            },

            onStateChange: function(e) {
                // log
                console.log("YouTube state change ", e);

                // Finished
                if (e.data == 0) {
                    console.log("Finished");
                }

                // Playing
                else if (e.data === YT.PlayerState.PLAYING) {
                    console.log("Playing");
                }

                // Pausing
                else if (e.data === 2) {
                    console.log("Pausing");
                }

                // Buffering
                else if (e.data === 3) {
                    console.log("Buffering");
                }
            }
        }
    });

}
</script>

<script src="https://www.youtube.com/iframe_api"></script>

Ответ 1

У меня возникло много проблем с видеоплеерами, особенно при работе автозапуска в разных браузерах и разных устройствах.

Кажется, что функция автовоспроизведения и игра/пауза API возились с eachother, что привело к панике состояния игрока.

Окончательное решение, которое лучше всего срабатывало в моем случае:

Установите автовоспроизведение в положение "autoplay: 0" в playerVars. "Api.playVideo();" вы используете в своей функции onReady: function(), чтобы взять ее оттуда и вывести игрока в состояние "play".