Видео на ютубе не загружается с плейлистами

У меня возникают проблемы с постановкой плейлиста в очередь с помощью API YouTube IFrame. (https://developers.google.com/youtube/iframe_api_reference#Queueing_Functions)

Я использую flash для показа видео на YouTube. Использование HTML5 показывает еще одну проблему, когда вызов видеовоспроизведения вызывается несколько раз перед загрузкой видео.

При загрузке плейлиста само видео не загружается. Он отображается на вкладке сети как вызов воспроизведения видео, который находится в состоянии ожидания, пока не истечет время ожидания через 7,5 минут, после чего он попытается снова, и все работает. Плейлист, кстати, успешно загрузился — при наведении на iframe ютуба показывается загруженный плейлист.

Код для репликации приведен ниже, и проблема обнаруживается после следующих шагов: 1. Щелкните канал. 2. Если канал загружается, перейдите к пункту 1, в противном случае проверьте вкладку сети.

Я знаю, что метод репликации надуман, однако я вижу это «иногда» при первой загрузке.

Воспроизводимый канал не виноват - это было замечено на многих разных каналах.

Это мой код? Есть ли обходной путь? Есть ли исправление?

Протестировано на 32-разрядной версии Windows 7 с использованием Chrome 28, Firefox 22.0 и IE 10.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
        <title>
            Youtube Test
        </title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        <script type='text/javascript'>
var collection = [];
var player = null;
var playlistEnqueued = false;

function clear() {
    // Removes the iframe.
    if (player !== null) {
        player.destroy();
    }

    collection = [];
    playlistEnqueued = false;
    player = null;
}

function createYT(videoId) {
    // Clear anything that's up currently
    clear();

    // Yes, this could be $.ajax, however this way reduces the dependency on jQuery
    // further for the purposes of this test.
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            parseJSONResponse(JSON.parse(xmlhttp.responseText));
        }
    }
    xmlhttp.open("GET", "https://gdata.youtube.com/feeds/users/" + videoId + "/uploads?alt=json", true);
    xmlhttp.send();
}

function parseJSONResponse(data) {
    var feed = data.feed;
    $.each(feed.entry, function(index, entry, list) {
        collection.push(entry.id.$t.match('[^/]*$')[0]);
    });
    playVideo();
}

function playVideo(videoId) {
    try {
        if (videoId === undefined || videoId === null) {
            videoId = collection[0];
        }
        if (typeof(YT) == 'undefined' || typeof(YT.Player) == 'undefined') {
            window.onYouTubeIframeAPIReady = function() {
                playVideo(videoId);
            };
            $.getScript('//www.youtube.com/iframe_api');
        } else {
            if (playlistEnqueued === true) {
                player.playVideoAt(0);
            } else {
                player = new YT.Player('video', {
                    events: {
                        'onReady':function(event) {
                            try {
                                player.cuePlaylist(collection);
                            } catch (e) {
                                console.error(e);
                            }
                        },
                        'onError':function(error) {
                            console.error(error);
                        }
                    },
                    videoId: videoId,
                    width: 425,
                    height: 356,
                    playerVars: {
                        autoplay: 1,
                    }
                });

                // Attaching event listener after object creation due to
                // http://stackoverflow.com/questions/17078094/youtube-iframe-player-api-onstatechange-not-firing
                player.addEventListener('onStateChange', function(state) {
                    try {
                        stateChanged(state);
                    } catch (e) {
                        console.error(e);
                    }
                });
            }
        }
    } catch (e) {
        console.error(e);
    }
}

function stateChanged(state) {
    // This state will be called on enqueueing a playlist
    if (state.data == 5) {
        playlistEnqueued = true;

        playVideo();
    }
}

$(document).on('ready', function() {
    var player = $(document).find("#player");

    $("a").on('click', function() {
        var channel = $(this).attr('data-channel');
        createYT(channel);
        return false;
    });
});

        </script>
    </head>
    <body>
        <div class='test'>
            <div id='video'>
            </div>
            <a href='#' data-channel='mit'>MIT</a>
            <a href='#' data-channel='tedtalksdirector'>TED</a>
            <a href='#' data-channel='minutephysics'>Minute Physics</a>
        </div>
    </body>
</html>

При использовании флэш-памяти и ожидании истечения времени ожидания видеосоединения и повторной попытке на вкладке сети отображается следующее. Как вы можете видеть, он «ожидает», потерпел неудачу, а затем повторил попытку через 7,5 минут.

Вкладка сети Chrome после начала воспроизведения видео: вкладка сети Chrome при воспроизведении видео

Больше изображений, когда я наберу 10 очков репутации...


person Dominic Orme    schedule 18.07.2013    source источник


Ответы (1)


У меня это работает на jsFiddle (http://jsfiddle.net/3Bm2V/5/) и вроде работает. я должен был изменить

$(document).on('ready', function () {

to

$(function() {

чтобы заставить его работать в jsFiddle, попробуйте ссылку выше и посмотрите, работает ли она у вас сейчас?

person TFk    schedule 18.07.2013
comment
К сожалению нет. Я пока не могу размещать изображения на SO, поэтому я не могу показать вам, как выглядит сетевая вкладка Chrome, однако даже в вашем JS Fiddle мне удалось воспроизвести проблему, которую я описал. - person Dominic Orme; 18.07.2013
comment
Ваш скрипт вроде работает. Я добавил: ‹!DOCTYPE html PUBLIC --//W3C//DTD XHTML 1.0 Strict//EN w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd› вверху страницы и ‹meta content=text/html;charset=utf-8 http-equiv=Content -Введите› в начале ‹head›. - person Als; 19.07.2013
comment
В Chrome я получаю эти ошибки после перехода по ссылке TED, но первое видео загружается и начинает воспроизводиться автоматически. Ошибки в консоли: Заблокирован доступ кадра с источником youtube.com к кадру с источником localhost. Протоколы, домены и порты должны совпадать. www-embed-player-vflT5t3ca.js:217 g.Ua www-embed-player-vflT5t3ca.js:217 g.vd www-embed-player-vflT5t3ca.js:216 g.qb www-embed-player-vflT5t3ca. js: 215 (анонимная функция) www-embed-player-vflT5t3ca.js: 209 Uncaught TypeError: невозможно вызвать метод «применить» неопределенного www-widgetapi-vfluS_Dp5.js: 22 - person Als; 19.07.2013
comment
Похоже, что происходит несколько возможных проблем. Я использую flash для показа видео на YouTube и подробно описываю проблему в исходном посте. Однако при использовании средства просмотра HTML5 возникает еще одна проблема, когда вызов воспроизведения видео выполняется несколько раз и в конечном итоге работает. - person Dominic Orme; 19.07.2013
comment
@Als - что вы видите на вкладке сети, а не в консоли? Ошибку можно увидеть и в jsFiddle. - person Dominic Orme; 19.07.2013
comment
Я вижу, вы добавили 2 строки, которые я упомянул. - person Als; 19.07.2013
comment
jsFiddle автоматически воспроизводит загруженное видео после нажатия на ссылку. Используя ваш скрипт: на вкладке сети я вижу сотни запросов GET. Я также получаю ту же ошибку в нижней части вкладки сети: доступ к фрейму с источником youtube.com заблокирован. фрейм с источником localhost. Протоколы, домены и порты должны совпадать. www-embed-player-vflT5t3ca.js:217 g.Ua www-embed-player-vflT5t3ca.js:217 g.vd www-embed-player-vflT5t3ca.js:216 g.qb www-embed-player-vflT5t3ca. js:215 (анонимная функция) www-embed-player-vflT5t3ca.js:209 - person Als; 19.07.2013
comment
Я не вижу ожидающих запросов, и после нажатия на ссылку видео начинает воспроизводиться в течение 10 секунд. - person Als; 19.07.2013
comment
@Als - снова обновил проблему. Я добавил изображение моей сетевой вкладки. Используете ли вы проигрыватель HTML5? Щелкните правой кнопкой мыши видео, если вы не знаете. - person Dominic Orme; 19.07.2013
comment
Я не вижу ошибки, которая показана на вашем изображении. У меня нет ожидающих запросов на вкладке сети Chrome. С Хромом выбран флеш плеер (версия 11,8,800,97). В Firefox выбран проигрыватель html5. Оба работают нормально. - person Als; 19.07.2013