如何嵌入新的Youtube的实时视频永久URL?

时间:2016-09-01 15:45:32

标签: video youtube embed live live-streaming

我在youtube上播放了很多内容,从昨天起我经历了一个奇怪的事情:

我在我的网站中嵌入了直播网址。它是youtube.com/embed/ABCDE(普通嵌入链接)。该链接用于显示当前直播,而不是特定视频。例如:

我正在播放,您可以在youtube.com/embed/ABCDE上观看。 当我完成后,视频会获得自己的网址,例如youtube.com/watch?v=FGHIJ。在下一次我将流式传输时,用户可以在youtube.com/embed/ABCDE上观看流(这是一个未更改的永久网址)。

现在,每次流式传输时,直播都会在第一时间获得自己的链接,这意味着每次流式传输时都必须手动更新我的嵌入代码。

我对Google,SO和YouTube进行了一些研究,我发现直播的永久网址为youtube.com/channel/CHANNEL_ID/live。它太棒了,但是我找不到嵌入它的方法。

(我使用wordpress而且我没有找到任何插件自动为我做这件事。)

TL:DR; 如何在[{1}}页面中嵌入直播?

5 个答案:

答案 0 :(得分:56)

频道直播的嵌入网址为:

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

您可以在https://www.youtube.com/account_advanced

找到您的CHANNEL_ID

答案 1 :(得分:7)

问题是双重的:

  1. WordPress重新格式化YouTube链接
  2. 您需要自定义嵌入链接来支持实时流嵌入
  3. 作为先决条件(截至2016年8月),您需要link an AdSense account,然后在您的YouTube频道启用获利功能。这是一个痛苦的变化,打破了很多直播流。

    您需要为嵌入使用以下网址格式:

    <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>'; ?>
    

    请告诉我这是否适合您!

答案 2 :(得分:0)

您是否尝试过名为“Youtube Live Stream Auto Embed”的插件

它似乎正在发挥作用。检查一次。

答案 3 :(得分:0)

以下是在 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>

随心所欲地调整!

答案 4 :(得分:0)

当您在 YouTube 频道上播放直播时,接受的答案是正确的。

但是当您没有直播或什至在使用 YouTube Premiere 时,嵌入内容会显示如下内容 - enter image description here

嵌入链接的网站看起来很糟糕。

为了解决这个问题,可以使用 YouTube API,但免费 API 调用的次数非常有限。

解决方案: 网页抓取。 检查 Youtube 频道是否为 LIVE / Premiere。 在这两种情况中的任何一种情况下,视频将首先显示在频道中,网页源将包含文本 {"text":" watching"}(观看前请注意空格)。这将有助于获取当前正在播放的视频。

如果 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)){
      //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;
    });
});