【问题标题】:How to embed new Youtube's live video permanent URL?如何嵌入新的 Youtube 直播视频永久 URL?
【发布时间】:2017-01-09 14:17:22
【问题描述】:

我经常在 youtube 上直播,从昨天开始我经历了一件奇怪的事情:

我在我的网站中嵌入了直播 URL。它是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;如何将直播嵌入页面youtube.com/channel/CHANNEL_ID/live

【问题讨论】:

    标签: video youtube embed live live-streaming


    【解决方案1】:

    频道直播的嵌入网址是:

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

    您可以在https://www.youtube.com/account_advanced找到您的CHANNEL_ID

    【讨论】:

    • 优秀的信息... Youtube 没有提供直播视频的嵌入 url 但是通过显示的格式,我能够在不使用共享选项的情况下获取 url 来获取 iframe tag 的嵌入 url :)
    • 这在 2017 年 12 月运行良好。感谢队友,示例完整嵌入代码 <iframe width="560" height="349" src="https://www.youtube.com/embed/live_stream?channel=yourChannelid" frameborder="0" allowfullscreen></iframe>
    • 今天看到这个,对我帮助很大,谢谢。我需要嵌入另一个频道(不是我自己的),对于那些需要做类似的人来说,在这里找到频道的 ID - commentpicker.com/youtube-channel-id.php
    • 注意:必须将直播的可见性设置为“公开”才能使用(截至 2018 年 10 月 20 日..或该日期左右)。
    • 奇怪的是,这个链接只能工作一次。在我结束直播并开始新直播后,此链接将始终显示一个播放器窗口,显示“直播已停止”。(截至 2019 年 7 月 15 日)
    【解决方案2】:

    问题有两个方面:

    1. WordPress 重新格式化 YouTube 链接
    2. 您需要自定义嵌入链接来支持直播嵌入

    作为先决条件(截至 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>
    

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

    如果这对你有用,请告诉我!

    【讨论】:

      【解决方案3】:

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

      它似乎正在工作。检查一次。

      【讨论】:

      【解决方案4】:

      下面是如何在 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>
      

      随心所欲地调整!

      【讨论】:

        【解决方案5】:

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

        但是,当您不在直播时,甚至在使用 YouTube 首映时,嵌入会显示如下内容 -

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

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

        解决方案:网页抓取。 检查 Youtube 频道是否为 LIVE / Premiere。 在这两种情况下,视频将首先出现在频道中,并且网页源将有一个文本{"text":" watching"}(观看前请注意空格)。这将有助于获取当前的流媒体视频。

        如果 YouTube 频道没有直播,请从 YouTube 频道的 RSS 源中找到最新视频并嵌入该视频。 Youtube 频道的 RSS 提要是 - https://www.youtube.com/feeds/videos.xml?channel_id=&lt;_YOUR_CHANNEL_ID_HERE_&gt;&amp;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;
            });
        });

        【讨论】:

        • 仅供参考,它是 scrape(和 scrapescrapedscraper)不是报废
        • @barny 主要目的是分享代码,感谢指正!
        猜你喜欢
        • 1970-01-01
        • 2012-10-12
        • 2022-06-30
        • 1970-01-01
        • 2011-07-10
        • 2018-01-09
        • 1970-01-01
        • 2016-06-07
        • 2017-11-05
        相关资源
        最近更新 更多