【问题标题】:Youtube video not loading with playlistsYoutube 视频未加载播放列表
【发布时间】:2013-07-18 15:00:03
【问题描述】:

我在使用 YouTube IFrame API 将播放列表排入队列时遇到问题。 (https://developers.google.com/youtube/iframe_api_reference#Queueing_Functions)

我正在使用 flash 来显示 youtube 视频。使用 HTML5 会显示另一个问题,即在视频加载之前多次调用 videoplayback 调用。

加载播放列表时,视频本身不会加载。它显示在网络选项卡中 作为对“挂起”的视频播放的调用,直到它在 7.5 分钟后超时,此时它再次尝试并且一切正常。顺便说一句,播放列表已成功加载 - 将鼠标悬停在 youtube iframe 上会显示已加载的播放列表。

复制此代码的代码如下,按照以下步骤发现问题: 1. 点击一个频道 2.如果频道加载,转到1,否则检查网络选项卡。

我知道复制的方法是人为的,但是我“有时”会看到这种情况 首次加载时。

播放频道没有问题 - 许多不同的频道都出现过这种情况。

这是我的代码吗?有解决办法吗?有解决办法吗?

使用 Chrome 28、Firefox 22.0 和 IE 10 在 Windows 7 32 位上测试

<!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>

使用 Flash 时,在等待视频连接超时并重试时,网络选项卡中会显示以下内容。如您所见,它处于“挂起”状态,失败,然后在 7.5 分钟后再次尝试。

视频开始播放后的 Chrome 网络标签: Chrome network tab on video playback

当我的声望超过 10 时会有更多图片...

【问题讨论】:

    标签: javascript youtube-api connection-timeout


    【解决方案1】:

    我已经在 jsFiddle (http://jsfiddle.net/3Bm2V/5/) 上启动并运行它,它似乎工作正常。我确实不得不改变

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

    $(function() {

    要让它在 jsFiddle 中工作,所以试试上面的链接,看看它现在是否适合你?

    【讨论】:

    • 遗憾的是没有。我还不能将图像放到 SO 上,所以我无法向您展示 Chrome 的网络选项卡的外观,但是即使在您的 JS Fiddle 中,我也设法复制了我描述的问题。
    • 您的脚本似乎正在运行。我在页面顶部添加: ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" rel="nofollow" target="_blank">w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 和 的开头。
    • 在 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: Cannot call method 'apply' of undefined www-widgetapi-vfluS_Dp5.js:22
    • 似乎发生了多个可能问题。我正在使用 flash 来显示 YouTube 视频,并在原始帖子中详细了解问题。但是,在使用 HTML5 查看器时,会出现另一个问题,即多次调用 videoplayback 并最终正常工作。
    • @Als - 您在网络选项卡中看到了什么,而不是控制台?该错误也可以在 jsFiddle 中看到。
    猜你喜欢
    • 2014-04-29
    • 2017-03-30
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2018-03-10
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多