在没有视频 ID 的情况下嵌入 YouTube 频道的当前直播

Embed a YouTube channel's current live stream without the video ID

每次用户在 YouTube 上开始直播时,都会为直播生成一个新的 ID,以及相应的视频和 URL。目前,如果我想嵌入直播,我可以使用 YouTube 的共享功能将视频添加到我的 iFrame 页面中。

当用户停止流式传输时,实时流的嵌入会自动切换为显示该流的录制内容。但是,如果用户稍后再次开始广播,嵌入将继续显示旧录制而不是切换到新流。这是因为嵌入中的视频 ID 是硬编码的,每个流都会生成一个新的视频 ID。

我的目标是创建一个嵌入,该嵌入将在用户进行流式传输时自动显示他们的实时流,并显示他们是在线还是离线的指示。是否有允许我执行此操作的嵌入 URL,或者 API 中是否有可能有用的内容?

我想嵌入不属于我自己的其他流,所以我需要以不需要主播登录或在我的网站上进行身份验证的方式执行此操作。

据我所知,YouTube API 中没有任何内置功能可以让您在不知道频道 ID 的情况下自动嵌入频道的当前直播流。也就是说,可以通过编写自定义 API 并将其托管在您自己的服务器上来自己实现。

我知道这看起来是一项艰巨的任务,因此我在下面列出了一些粗略的步骤来帮助您入门。

  1. 在您自己的服务器上设置端点。你可以接受一个 channelId 参数或硬编码参数,具体取决于可扩展性 你想要这样。
  2. 为指定的 channelIdeventType=live 查询 YouTube's search endpoint1。对此的 HTTPS 请求将如下所示:
    https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=[CHANNEL_ID]&eventType=live&maxResults=1&order=date&type=video&key=[YOUR_API_KEY]
  3. 检查 search JSON 响应。如果它 returns 有任何结果 (data.pageInfo.totalResults > 0),您就知道该频道是直播的。
  4. 如果频道是直播的,根据查询响应中的视频 ID (data.items[0].id.videoId),将请求重定向到您的服务器直接到直播视频的嵌入 URL。
  5. 如果频道未直播,请创建一个您认为合适的占位符,或者再次请求搜索 eventType=completed 以获取过去的广播,搜索 eventType=upcoming 以获取预定的广播,或者删除eventType 获取最新视频的参数。

一旦您拥有可以响应和重定向请求的服务器,您就可以在您的页面中嵌入一个直接指向您的 API URL 的 iFrame。您的服务器将处理该逻辑,并使用重定向自动将 iFrame 更改为 YouTube 视频播放器,而无需您执行客户端逻辑或公开您的 API 键2.


1 与所有 YouTube API 请求一样,search#list 次查询将计入您的每日配额。如果您打算将其作为高流量端点,您可以向 YouTube 请求增加配额,或者在您的终端实施缓存解决方案以减少您发出的请求数量。

2 GCP(Google 云平台),您将使用它来管理您对 YouTube 数据的访问 API,当您不得不在客户端公开密钥时,它可以很好地防止 API 密钥被盗。话虽如此,最佳做法是尽可能将密钥存储在服务器上以保密。

如果您知道 YouTube 频道的 ID,并且该频道流式传输设置为 Public 的直播,带有此 URL 的 iframe 将显示它:

https://www.youtube.com/embed/live_stream?channel=YOUR_CHANNEL_ID_HERE

不幸的是,我还没有找到一种类似的简单方法来永久 直播。