如何永久嵌入新的Youtube直播视频URL?
How to embed new Youtube's live video permanent URL?
我经常在 youtube 上直播,从昨天开始我经历了一件奇怪的事情:
我在我的网站中嵌入了直播 URL。它是 youtube.com/embed/ABCDE
(正常嵌入 link)。 link 用于显示 当前 直播而不是特定视频。例如:
我正在直播,你可以在 youtube.com/embed/ABCDE
上观看。
当我完成后,视频会得到自己的 url,类似于 youtube.com/watch?v=FGHIJ
。下次我直播时,用户可以在 youtube.com/embed/ABCDE
上观看直播(这是一个永久的 url,没有改变)。
现在,每次我直播时,直播都会首先获得自己的 link,这意味着我每次直播时都必须手动更新我的嵌入代码。
我对 Google、SO 和 YouTube 进行了一些研究,发现直播的永久 url 是 youtube.com/channel/CHANNEL_ID/live
。太棒了,但我找不到嵌入它的方法。
(我使用 wordpress,但我没有找到任何插件可以自动为我完成)。
TL:DR;如何在页面中嵌入直播youtube.com/channel/CHANNEL_ID/live
?
您是否尝试过名为“Youtube Live Stream Auto Embed”的插件
它似乎正在工作。检查一次。
问题有两个:
- WordPress 重新格式化 YouTube link
- 您需要自定义嵌入 link 以支持直播流嵌入
作为先决条件(自 2016 年 8 月起),您需要 link an AdSense account 然后在您的 YouTube 频道中启用获利功能。这是一个痛苦的变化,打破了很多直播。
您需要使用以下 URL 嵌入格式:
<iframe width="560" height="315" src="https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID&autoplay=1" frameborder="0" allowfullscreen></iframe>
&autoplay=1
不是必需的,但我喜欢包含它。将 CHANNEL
更改为您频道的 ID。需要注意的一件事是,一旦您提交更改,WordPress 可能会重新格式化 URL。因此,您需要一个允许您使用原始代码而不是覆盖它的插件。使用自定义 PHP 代码插件可以提供帮助,您只需像这样回显代码:
<?php echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID&autoplay=1" frameborder="0" allowfullscreen></iframe>'; ?>
让我知道这是否对您有用!
频道直播的嵌入 URL 是:
https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID
找到您的 CHANNEL_ID
以下是如何在 Squarespace 中使用嵌入块 类 来创建响应。
将其放入代码块中:
<div class="sqs-block embed-block sqs-block-embed" data-block-type="22" >
<div class="sqs-block-content"><div class="intrinsic" style="max-width:100%">
<div class="embed-block-wrapper embed-block-provider-YouTube" style="padding-bottom:56.20609%;">
<iframe allow="autoplay; fullscreen" scrolling="no" data-image-dimensions="854x480" allowfullscreen="true" src="https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID_HERE" width="854" data-embed="true" frameborder="0" title="YouTube embed" class="embedly-embed" height="480">
</iframe>
</div>
</div>
</div>
随意调整!
当您的 YouTube 频道上有直播时,接受的答案是正确的。
但是当您不在现场或者甚至在使用 YouTube Premiere 时,嵌入会显示如下内容 -
嵌入 link 的网站看起来很糟糕。
要绕过这个 YouTube API 可以使用,但免费 API 通话的次数非常有限。
解决方案: 网页抓取。
检查 Youtube 频道是否直播/首播。
在这两种情况中的任何一种情况下,视频将首先出现在频道中,并且网页源将包含文本 {"text":" watching"}
(注意观看前的 space)。这将有助于获取当前流媒体视频。
如果 YouTube 频道没有直播,请从 YouTube 频道的 RSS Feed 中找到最新的视频并嵌入该视频。
Youtube 频道的 RSS 提要是 -
https://www.youtube.com/feeds/videos.xml?channel_id=<_YOUR_CHANNEL_ID_HERE_>&orderby=published
需要服务器端脚本/程序。 (Node.JS / Python / PHP)
我用过PHP.
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
$channel_id = '<_YOUR_CHANNEL_ID_HERE_>';
//Option 1 - Check if YouTube is streaming LIVE
//Web scraping to check if we are LIVE on YouTube
$contents = file_get_contents('https://www.youtube.com/channel/'.$channel_id);
$searchfor = '{"text":" watching"}';
$pattern = preg_quote($searchfor, '/');
$pattern = "/^.*$pattern.*$/m";
if(preg_match_all($pattern, $contents, $matches)){
//truncate $contents so that the match can be found easily.
$contents = substr($contents, strpos($contents, $searchfor));
//If the video is LIVE or Premiering, fetch the video id.
$search_video_id = '{"url":"/watch?v=';
$video_pattern = preg_quote($search_video_id, '/');
$video_pattern = "~$video_pattern\K([A-Za-z0-9_\-]{11})~";
preg_match($video_pattern, $contents, $video_ids);
$data = [ 'status' => 200,
'isLive' => true,
'iframeUrl' => 'https://www.youtube.com/embed/'.$video_ids[0]
];
} else {
//Option 2 - Get the RSS YouTube Feed and the latest video from it
$youtube = file_get_contents('https://www.youtube.com/feeds/videos.xml?channel_id='.$channel_id.'&orderby=published');
$xml = simplexml_load_string($youtube, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$youtube = json_decode($json, true);
foreach ($youtube['entry'] as $k => $v) {//get the latest video id
$link = $v['link']['@attributes']['href'];
$pos = strrpos($link, '=');
$id = substr($link, $pos+1, strlen($link)-$pos);
break;
}
$data = [ 'status' => 200,
'isLive' => false,
'iframeUrl' => 'https://youtube.com/embed/'.$id
];
}
echo json_encode( $data, JSON_UNESCAPED_SLASHES );
?>
现在在 UI 中,使用 jQuery 向您的服务器发送和 AJAX 请求以获取 iframe URL。
// Check if YouTube LIVE is active, if not point to the latest video
let channelID = "<_YOUR_CHANNEL_ID_HERE_>";
let iframe = document.querySelector("#my-iframe"); //get the iframe element.
let ts = new Date().getTime();
$.getJSON("<SERVER>/<PHP_SCRIPT_ABOVE>.php", {_: ts}).done(function(resp) {
if(resp){
iframe.src = resp.iframeUrl;
}
}).fail(function(){
//fall back
let reqURL = "https://www.youtube.com/feeds/videos.xml?channel_id=";
let ts = new Date().getTime();
$.getJSON("https://api.rss2json.com/v1/api.json?rss_url=" + encodeURIComponent(reqURL)+channelID, {_: ts}).done( function(data) {
let link = data.items[0].link;
let id = link.substr(link.indexOf("=")+1);
iframe.src = "https://youtube.com/embed/"+id;
});
});
我经常在 youtube 上直播,从昨天开始我经历了一件奇怪的事情:
我在我的网站中嵌入了直播 URL。它是 youtube.com/embed/ABCDE
(正常嵌入 link)。 link 用于显示 当前 直播而不是特定视频。例如:
我正在直播,你可以在 youtube.com/embed/ABCDE
上观看。
当我完成后,视频会得到自己的 url,类似于 youtube.com/watch?v=FGHIJ
。下次我直播时,用户可以在 youtube.com/embed/ABCDE
上观看直播(这是一个永久的 url,没有改变)。
现在,每次我直播时,直播都会首先获得自己的 link,这意味着我每次直播时都必须手动更新我的嵌入代码。
我对 Google、SO 和 YouTube 进行了一些研究,发现直播的永久 url 是 youtube.com/channel/CHANNEL_ID/live
。太棒了,但我找不到嵌入它的方法。
(我使用 wordpress,但我没有找到任何插件可以自动为我完成)。
TL:DR;如何在页面中嵌入直播youtube.com/channel/CHANNEL_ID/live
?
您是否尝试过名为“Youtube Live Stream Auto Embed”的插件
它似乎正在工作。检查一次。
问题有两个:
- WordPress 重新格式化 YouTube link
- 您需要自定义嵌入 link 以支持直播流嵌入
作为先决条件(自 2016 年 8 月起),您需要 link an AdSense account 然后在您的 YouTube 频道中启用获利功能。这是一个痛苦的变化,打破了很多直播。
您需要使用以下 URL 嵌入格式:
<iframe width="560" height="315" src="https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID&autoplay=1" frameborder="0" allowfullscreen></iframe>
&autoplay=1
不是必需的,但我喜欢包含它。将 CHANNEL
更改为您频道的 ID。需要注意的一件事是,一旦您提交更改,WordPress 可能会重新格式化 URL。因此,您需要一个允许您使用原始代码而不是覆盖它的插件。使用自定义 PHP 代码插件可以提供帮助,您只需像这样回显代码:
<?php echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID&autoplay=1" frameborder="0" allowfullscreen></iframe>'; ?>
让我知道这是否对您有用!
频道直播的嵌入 URL 是:
https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID
找到您的 CHANNEL_ID
以下是如何在 Squarespace 中使用嵌入块 类 来创建响应。
将其放入代码块中:
<div class="sqs-block embed-block sqs-block-embed" data-block-type="22" >
<div class="sqs-block-content"><div class="intrinsic" style="max-width:100%">
<div class="embed-block-wrapper embed-block-provider-YouTube" style="padding-bottom:56.20609%;">
<iframe allow="autoplay; fullscreen" scrolling="no" data-image-dimensions="854x480" allowfullscreen="true" src="https://www.youtube.com/embed/live_stream?channel=CHANNEL_ID_HERE" width="854" data-embed="true" frameborder="0" title="YouTube embed" class="embedly-embed" height="480">
</iframe>
</div>
</div>
</div>
随意调整!
当您的 YouTube 频道上有直播时,接受的答案是正确的。
但是当您不在现场或者甚至在使用 YouTube Premiere 时,嵌入会显示如下内容 -
嵌入 link 的网站看起来很糟糕。
要绕过这个 YouTube API 可以使用,但免费 API 通话的次数非常有限。
解决方案: 网页抓取。
检查 Youtube 频道是否直播/首播。
在这两种情况中的任何一种情况下,视频将首先出现在频道中,并且网页源将包含文本 {"text":" watching"}
(注意观看前的 space)。这将有助于获取当前流媒体视频。
如果 YouTube 频道没有直播,请从 YouTube 频道的 RSS Feed 中找到最新的视频并嵌入该视频。
Youtube 频道的 RSS 提要是 -
https://www.youtube.com/feeds/videos.xml?channel_id=<_YOUR_CHANNEL_ID_HERE_>&orderby=published
需要服务器端脚本/程序。 (Node.JS / Python / PHP)
我用过PHP.
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
$channel_id = '<_YOUR_CHANNEL_ID_HERE_>';
//Option 1 - Check if YouTube is streaming LIVE
//Web scraping to check if we are LIVE on YouTube
$contents = file_get_contents('https://www.youtube.com/channel/'.$channel_id);
$searchfor = '{"text":" watching"}';
$pattern = preg_quote($searchfor, '/');
$pattern = "/^.*$pattern.*$/m";
if(preg_match_all($pattern, $contents, $matches)){
//truncate $contents so that the match can be found easily.
$contents = substr($contents, strpos($contents, $searchfor));
//If the video is LIVE or Premiering, fetch the video id.
$search_video_id = '{"url":"/watch?v=';
$video_pattern = preg_quote($search_video_id, '/');
$video_pattern = "~$video_pattern\K([A-Za-z0-9_\-]{11})~";
preg_match($video_pattern, $contents, $video_ids);
$data = [ 'status' => 200,
'isLive' => true,
'iframeUrl' => 'https://www.youtube.com/embed/'.$video_ids[0]
];
} else {
//Option 2 - Get the RSS YouTube Feed and the latest video from it
$youtube = file_get_contents('https://www.youtube.com/feeds/videos.xml?channel_id='.$channel_id.'&orderby=published');
$xml = simplexml_load_string($youtube, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$youtube = json_decode($json, true);
foreach ($youtube['entry'] as $k => $v) {//get the latest video id
$link = $v['link']['@attributes']['href'];
$pos = strrpos($link, '=');
$id = substr($link, $pos+1, strlen($link)-$pos);
break;
}
$data = [ 'status' => 200,
'isLive' => false,
'iframeUrl' => 'https://youtube.com/embed/'.$id
];
}
echo json_encode( $data, JSON_UNESCAPED_SLASHES );
?>
现在在 UI 中,使用 jQuery 向您的服务器发送和 AJAX 请求以获取 iframe URL。
// Check if YouTube LIVE is active, if not point to the latest video
let channelID = "<_YOUR_CHANNEL_ID_HERE_>";
let iframe = document.querySelector("#my-iframe"); //get the iframe element.
let ts = new Date().getTime();
$.getJSON("<SERVER>/<PHP_SCRIPT_ABOVE>.php", {_: ts}).done(function(resp) {
if(resp){
iframe.src = resp.iframeUrl;
}
}).fail(function(){
//fall back
let reqURL = "https://www.youtube.com/feeds/videos.xml?channel_id=";
let ts = new Date().getTime();
$.getJSON("https://api.rss2json.com/v1/api.json?rss_url=" + encodeURIComponent(reqURL)+channelID, {_: ts}).done( function(data) {
let link = data.items[0].link;
let id = link.substr(link.indexOf("=")+1);
iframe.src = "https://youtube.com/embed/"+id;
});
});