【问题标题】:YouTube API not working with iPad / iPhone / non-Flash deviceYouTube API 不适用于 iPad / iPhone / 非 Flash 设备
【发布时间】:2012-02-16 20:48:30
【问题描述】:

这段代码在桌面浏览器中运行良好(代码由@Rob-W 提供),点击缩略图,相邻的视频将开始播放,使用 YouTube 的 API。

HTML

<div id="tabs2">
    <div>
    <img class='thumb' src='http://i2.cdnds.net/11/34/odd_alan_partridge_bio_cover.jpg'>
    <iframe id="frame1" width="640" height="390" frameborder="0" title="YouTube video player"type="text/html"src="http://www.youtube.com/embed/u1zgFlCw8Aw?enablejsapi=1"></iframe>
    </div>

    <div>
        <img class='thumb' src='http://i2.cdnds.net/11/34/odd_alan_partridge_bio_cover.jpg'>
   <iframe id="frame2" width="640" height="390" frameborder="0" title="YouTube video player"type="text/html"src="http://www.youtube.com/embed/u1zgFlCw8Aw?enablejsapi=1"></iframe>
    </div>
</div>

CSS

#tabs2 div {
    position: relative;
}
/* For security reasons, an element cannor be placed over a frame */
/*.thumb {
    position: absolute;
}*/    
.play {
    border: 3px solid red;
}

JS

function getFrameID(id) {
    var elem = document.getElementById(id);
    if (elem) {
        if (/^iframe$/i.test(elem.tagName)) return id; //Frame, OK
        // else: Look for frame
        var elems = elem.getElementsByTagName("iframe");
        if (!elems.length) return null; //No iframe found, FAILURE
        for (var i = 0; i < elems.length; i++) {
            if (/^https?:\/\/(?:www\.)?youtube(?:-nocookie)?\.com(\/|$)/i.test(elems[i].src)) break;
        }
        elem = elems[i]; //The only, or the best iFrame
        if (elem.id) return elem.id; //Existing ID, return it
        // else: Create a new ID
        do { //Keep postfixing `-frame` until the ID is unique
            id += "-frame";
        } while (document.getElementById(id));
        elem.id = id;
        return id;
    }
    // If no element, return null.
    return null;
}

// Define YT_ready function.
var YT_ready = (function() {
    var onReady_funcs = [],
        api_isReady = false;
/* @param func function     Function to execute on ready
         * @param func Boolean      If true, all qeued functions are executed
         * @param b_before Boolean  If true, the func will added to the first
                                     position in the queue*/
    return function(func, b_before) {
        if (func === true) {
            api_isReady = true;
            for (var i = 0; i < onReady_funcs.length; i++) {
                // Removes the first func from the array, and execute func
                onReady_funcs.shift()();
            }
        }
        else if (typeof func == "function") {
            if (api_isReady) func();
            else onReady_funcs[b_before ? "unshift" : "push"](func);
        }
    }
})();
// This function will be called when the API is fully loaded

function onYouTubePlayerAPIReady() {
    YT_ready(true)
}

var players = {};
//Define a player storage object, to enable later function calls,
//  without having to create a new class instance again.
YT_ready(function() {
    $(".thumb + iframe[id]").each(function() {
        var identifier = this.id;
        var frameID = getFrameID(identifier);
        if (frameID) { //If the frame exists
            players[frameID] = new YT.Player(frameID, {
                events: {
                    "onReady": createYTEvent(frameID, identifier)
                }
            });
        }
    });
});

// Returns a function to enable multiple events
function createYTEvent(frameID, identifier) {
    return function (event) {
        var player = players[frameID]; // player object
        var the_div = $('#'+identifier).parent();
        the_div.children('.thumb').click(function() {
            var $this = $(this);
            $this.fadeOut().next().addClass('play');
            if ($this.next().hasClass('play')) {
                player.playVideo();
            }
        });
    }
}
// Load YouTube Frame API
(function(){ //Closure, to not leak to the scope
  var s = document.createElement("script");
  s.src = "http://www.youtube.com/player_api"; /* Load Player API*/
  var before = document.getElementsByTagName("script")[0];
  before.parentNode.insertBefore(s, before);
})();

JSFiddle

问题是它无法在 iOS 设备上播放(我认为是因为缺少 Flash 播放器,它只是挂起)。

我可以通过再次点击视频来强制它播放,这会提示它使用 QuickTime 播放。

但是如何让它自动与 QuickTime 一起播放呢?

【问题讨论】:

  • 注意:stopPlayer() 似乎确实有效 - 但是我停止播放后无法重新开始播放!!!它播放 1/2 秒并自行停止

标签: javascript ios youtube-api


【解决方案1】:

很抱歉,这在 iOS 中是不可能的。根据Apple's documentation

"...嵌入式媒体无法在 iOS 上的 Safari 中自动播放 - 用户总是启动播放。”

无论网络连接如何,限制都是一致的,因为它既是带宽决定,也是用户体验决定。

2016 年 10 月更新:值得注意的是,现在 iOS 10 已经发布并获得了可观的市场份额,人们可以利用 iOS 10 上视频播放方式的变化来获得自动播放行为.如果视频没有音轨或标签被静音,则可以进行自动播放。更多信息请访问this webkit blog。 YouTube API 可能很快就能很好地处理这个问题。

【讨论】:

  • 谢谢 Tegeril,我怀疑你是对的。如果几天后没有其他人回答,我会奖励你。我还有一个类似的问题,你觉得你也可以回答吗?非常感谢stackoverflow.com/questions/9033080/…
  • 我在几分钟前找到了另一个参考,但随后我的浏览器崩溃了。在某处有一个 YouTube 讨论最终证实了这一点:(
  • 任何 html5 视频 API 只能在用户初始化时工作。目前情况就是这样。
  • 这是过时的信息,您可以推出自己的解决方案或使用官方框架:github.com/youtube/youtube-ios-player-helper
  • @ABeanSits - 整篇文章都是关于在网络浏览器中自动播放视频,而不是使用原生 SDK。
【解决方案2】:

从 iOS 4 开始,UIWebView 具有 mediaPlaybackRequiresUserAction 属性。我不知道你是在 Web 上还是在原生应用中实现此功能,但在原生应用中将其设置为 NO 应该允许自动播放工作。

【讨论】:

  • 嗨,杰夫,它纯粹是在网络上,如我发布的 JSFiddle 所示。你能告诉我如何使用小提琴来实现它吗?谢谢
  • 如果是在网络上就不行;这仅适用于原生应用。
  • 所以这基本上是说如果您将 safari 嵌入到您自己的应用程序中,您可以让媒体自动播放。因此,如果他们愿意,iPad 版 Chrome 可以将其设置为 false - 但看起来他们没有
【解决方案3】:

您可以在 iOS 上使用YouTube iFrame API

【讨论】:

  • 他正在使用 YouTube iFrame API。它成功地从 YouTube chrome 转换为原生 iOS 播放图标,但该 API 并没有真正开始播放。
猜你喜欢
  • 2015-03-21
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多