【问题标题】:YouTube embed gives "restricted from playback on certain sites" error despite API metadata indicating otherwise尽管 API 元数据另有说明,但 YouTube 嵌入会出现“限制在某些网站上播放”错误
【发布时间】:2012-11-04 15:22:46
【问题描述】:

我正在尝试让我的客户端应用程序过滤掉不允许嵌入的视频。我的理解是,没有办法限制提要(即 format=5 是不够的)来做到这一点,我必须自己检查条目的属性,对于 <yt:accessControl> 标签和 <app:control> 和 @987654330 @标签。

这对我不起作用。

例如,这个视频: https://www.youtube.com/watch?v=waxat-_tRH8

不嵌入: https://www.youtube.com/embed/waxat-_tRH8

即使 API 返回的数据表明(据我所知)它应该能够嵌入: https://gdata.youtube.com/feeds/api/videos/waxat-_tRH8?v=2

该条目不包含任何<yt:noembed>标签(see prior question)<media:restriction type='country' relationship='deny'>ME DE RS</media:restriction>没有解释这一点,因为我在美国(see prior question)(see prior question)

我在这里错过了什么?

编辑:上面的嵌入链接在我的网络浏览器中有效,但在我的客户端应用程序的 WebView 中无效......!?

【问题讨论】:

标签: youtube youtube-api


【解决方案1】:

在初始化 youtube sdk 时添加播放器变量:

NSDictionary *playerVars = @{
                             @"origin" : @"http://www.youtube.com",
                             };
[self.playerView loadWithVideoId:@"videoid" playerVars:playerVars];

享受吧!

【讨论】:

    【解决方案2】:

    适用于在 Android 上的 webView 中遇到相同问题的用户。我通过添加与@RainCast 在她的回答中所做的类似的引用头字段来解决此问题。

     Map<String, String> extraHeaders = new HashMap<>();
     extraHeaders.put("Referer", "http://youtube.com");
     String url = "https://www.youtube.com/embed/dQw4w9WgXcQ";
    
     webView.loadUrl(url, extraHeaders);
    

    它适用于纯 URL,但我不知道如何在 webView 中注入 iFrame 时传递这些参数。

    【讨论】:

      【解决方案3】:

      您可以使用此答案。这在我的情况下非常有效-

      player vars 中添加originhttps://www.youtube.com

      See this answer

      【讨论】:

      • 对我来说,我必须添加 https
      【解决方案4】:

      试试这样

      <iframe width="300" height="200" src="www.youtube.com/embed/<video-id>?enablejsapi=1" frameborder="0" allowfullscreen></iframe>
      

      【讨论】:

        【解决方案5】:

        作为Jeff Posnick pointed out,有些视频有黑名单。如果您尝试从应用而不是网页请求带有黑名单的视频,您将看到以下错误消息:

        “此视频包含来自 ___ 的内容。在某些网站上限制播放。”

        很可能您的应用没有被列入黑名单,并且您被错误地列入黑名单。要解决此问题,您需要为您的 Youtube API 请求提供来源(如atulkhatri pointed out)。

        在您的 Youtube 视频请求标头中,将 Referer 设置为您打算从中拨打电话的域,(例如,您的应用对应网站的域)。如果您没有域,则可以轻松编写其他域,这也可能有效。

        • 对于 Android (Java),您可以查看示例 here

        • 对于 iOS,look above

        • 对于 React Native,您可以使用组件上的 origin 属性到您的域(originmentioned in the docs,但不会告诉您太多相关信息)。

        • Here is another example 在浏览器中遇到同样的问题,因为扩展程序阻止了 Referer 标头的发送。

        此答案适用于 Youtube 的 V3 API。

        【讨论】:

        • 我尝试在我的网站上嵌入视频(目前它是本地的,因此只能通过 IP 访问),我也面临同样的问题。如何在浏览器中更改推荐人。我所拥有的只是 iframe 嵌入代码。谢谢。
        • @fractal5 在本地工作可能会导致您出现此问题。您还可以查看this page 以获取更多信息,看看您的浏览器是否也可能是问题的一部分。
        • @JakeNelken 感谢您的署名。欣赏。
        • @JakeNelken 我使用这种方法通过添加引用来在我的 .NET 应用程序中播放嵌入受限视频。最近这停止了工作。 /embed 视频现在根本不播放,只是显示为黑屏,没有播放器正在加载,所以我认为这是一个 flash 问题,但 /v/ 链接播放正常,但限制绕过不再起作用.你有这方面的经验吗?
        • @JakeNelken 我解决了我的问题。 FEATURE_BROWSER_EMULATION 是票。 msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx
        【解决方案6】:

        实际上,如果您在此处嵌入视频:

        http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default

        像这样:

        <!DOCTYPE html>
        <html>
        <head>
        <title>Page Title</title>
        </head>
        <body>
        <iframe width="420" height="315" src="https://www.youtube.com/embed/waxat-_tRH8" frameborder="0" allowfullscreen></iframe>
        </body>
        </html>
        

        其实是可以玩的。所以问题实际上又回到了为什么它可以在网站上运行,而不是在 iOS 移动应用上?

        然后我发现了这个帖子:

        http://support.metacdn.com/hc/en-us/articles/204513985-Video-Player-Embed-Restriction

        它解释了由于缺少 HTTP 标头“Referer”字段,嵌入可能会受到限制。

        所以在设置了refer字段后,这个视频就会在iOS应用中播放:

        let youtubeURL = NSURL(string: "https://www.youtube.com/embed/YQHsXMglC9A?autoplay=1") 
        let youtubeRequest = NSMutableURLRequest(URL: youtubeURL!) 
        youtubeRequest.setValue("https://www.youtube.com", forHTTPHeaderField: "Referer") 
        webView.loadRequest(youtubeRequest)
        

        Wala,现在可以使用了!

        你快乐吗?因为我很开心。 :)

        【讨论】:

        • 我们如何为 android 做同样的事情?我正在使用离子框架 iframe 在浏览器上运行良好,但在 android 上运行良好。在 android 上它只是显示消息“限制在某些网站上播放”
        • 对不起@user1188867,我对Android不熟悉,你可以尝试搜索“如何在Android中修改HTTP Referer字段”,可能是同样的原因。
        • 对于某些 id 仍然无效,请任何人确认它适用于视频 id=5IJ14RAqz3s
        • @user1188867 请看我的answer
        • 真的很棒!感谢您的帮助。
        【解决方案7】:

        某些视频应用了域级白名单或黑名单。这由内容所有者自行决定。

        如果存在白名单或黑名单,并且无法确定嵌入站点的域(可能是因为在您的原生应用程序中没有真正的引用域),那么默认行为是阻止播放。

        这篇博文也有更多细节:http://youtube-eng.blogspot.co.uk/2011/12/understanding-playback-restrictions_28.html

        【讨论】:

        • 谢谢杰夫。一些后续行动: 1. 为了被允许播放这些视频,我能做些什么吗? 2. 如果没有,在加载嵌入之前,有没有办法通过 API 确定这些限制?事实上,由于呈现这些不可播放的视频,我的用户体验非常糟糕。
        • 不幸的是,没有。由于域白/黑名单的工作方式,该特定视频只能在嵌入到具有真实引用 URL 的真实网站上时播放。不,我们不会通过 API 公开这些列表。不过,这是一项长期存在的功能要求。
        • Jeff,现在可以通过 API v3 访问域级限制吗?有什么解决方法吗?
        • 我不相信它在 v3 API 响应中返回,但我不再处理 API 并且不具有权威性。
        • 嗯 8 年后没有解决方案,从流中获取缩略图怎么样?
        猜你喜欢
        • 2014-06-03
        • 2012-09-07
        • 2014-09-14
        • 2015-11-16
        • 2010-12-16
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        相关资源
        最近更新 更多