在尝试加载 YouTube 视频之前,如何判断它是不是可嵌入?

Posted

技术标签:

【中文标题】在尝试加载 YouTube 视频之前,如何判断它是不是可嵌入?【英文标题】:How can I tell if a YouTube video is embeddable before I try and load it?在尝试加载 YouTube 视频之前,如何判断它是否可嵌入? 【发布时间】:2012-04-09 02:13:52 【问题描述】:

我有一个无色的 YouTube 播放器,我正在尝试将视频加载到其中,但只有一些视频可以正常工作,而不是全部。如果我没记错的话,那些没有加载的内容是由于版权侵权(例如,卡通的某些情节没有加载,但一个孩子做后空翻的家庭电影可以)。我正在尝试做的是在我们尝试加载它们之后或之前找出这些视频是否可以加载。

例如,以下是 Nataly Dawn 的两个视频。一个加载,另一个不加载。

// loads and plays the video
ytplayer.loadVideoById("GhDGdT33K0k");

// doesn't load/play the video
ytplayer.loadVideoById("-KYUPJIzCyM");

通过查看the working video 和non-working video 的数据,我似乎看不到任何表明后者不可嵌入的信息。 [我正在寻找<yt:accessControl> 标签或缺少的yt:format='5'(参见How do I use the Youtube API to check if a video is embeddable?),但无济于事。]

根据我在控制台中的尝试,loadVideoById总是返回undefined,无论视频是否实际加载。我似乎找不到 API 方法来确定视频是否已经这样做了。

【问题讨论】:

您提到的两个视频似乎都可以加载和播放。例如使用:code.google.com/apis/ajax/playground/#change_the_playing_video Google Playground 有时会播放不可嵌入的视频,例如 qvr6K02dglc。您可以尝试将其嵌入到磁盘上的本地 html 文件中。 【参考方案1】:

您提到的两个视频对我来说似乎都可以加载和播放。例如使用:google code playground 并将您的视频插入 HTML 的选项标签中。

这里有一些提示。

在您的 gdata 请求中使用“v=2”参数以使用当前的 YT 数据 API。 This blog post lists several additional restrictions that you may need to check for to determine if a video playable or embeddable. 可以嵌入某些视频,但不能播放。在这种情况下,您唯一能做的就是使用 javascript PlayerAPI 查找表明它正在播放的 stateChange 事件,然后使用 setInterval 通过 getCurrentTime 轮询视频以了解它是否正在播放实际玩。不过,这对于大多数应用程序来说有点疯狂。

【讨论】:

来自博文“偶尔会出现更微妙的限制。目前并非所有这些都可以通过 API 查询。例如,某些视频只能在特定的一组域上播放. 正如我上面提到的,了解用户是否有权观看视频的唯一万无一失的方法是让他们尝试观看。那我看看你最后的选择。 :) 我最终发现我无法事先确定视频是否会加载;但是,在为 onError 事件设置处理程序后,我能够让它返回错误代码150,“当请求的视频不允许在嵌入式播放器中播放时进行广播。”为什么这会加载到代码游乐场而不是我的特定代码中,谁知道呢。 貌似有些视频是不允许嵌入的,但是在playground你可以看,比如qvr6K02dglc【参考方案2】:

现在您可以连接嵌入式 api 的 onError 事件并检查错误代码 101 和 150(它们是相同的),这表明视频被阻止嵌入播放。此外,这样做可以让您在发生其他错误(错误请求、html 5 问题等)的情况下采取不同的行动。

function onError(event)
    switch(event.data)
        case 2:
            console.log('request contains an invalid parameter value')
            break
        case 5:
            console.log('The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.')
            break
        case 100:
            console.log('The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.')
            break
        case 101:
        case 150:
            console.log('Uploader has blocked this content from embedded playback')
            break
        default:
            console.log('error code: '+event.data)

    

如果您只希望搜索 api 返回可嵌入的视频结果,请在您的 request 中包含 videoEmbeddable:"true"

【讨论】:

以上是关于在尝试加载 YouTube 视频之前,如何判断它是不是可嵌入?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出加载 youtube 嵌入式 iframe 的时间

YouTube:如何在静音的情况下呈现嵌入视频

如何在较新版本的 Delphi 中嵌入 YouTube 视频?

css 在optin显示之前,将包含YouTube视频集的div加载到我们手动触发的optin后面进行自动播放。我们将加载重叠

如何通过 youtube API 判断 youtube 视频的内​​容何时发生变化?

如何统一加载 YouTube 直播视频流? [关闭]