【问题标题】:How can I get the actual video URL of a YouTube live stream?如何获取 YouTube 直播的实际视频 URL?
【发布时间】:2016-06-07 03:05:06
【问题描述】:

有没有办法获取 YouTube 直播的 HLS 网址,例如 https://www.youtube.com/embed/WVZpCdHq3Qg

我尝试了典型的 get_video_info 方法,但它们似乎不适用于直播。

【问题讨论】:

  • 网址是什么意思? HLS 网址?

标签: youtube youtube-api youtube-data-api http-live-streaming youtube-livestreaming-api


【解决方案1】:

是的,这是可能的 由于问题是更新,此解决方案只能为您提供嵌入网址而不是 HLS 网址,请查看@JAL 答案。 使用资源search.list 和参数:

* part: id
* channelId: UCURGpU4lj3dat246rysrWsw
* eventType: live
* type: video

请求:

GET https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UCURGpU4lj3dat246rysrWsw&eventType=live&type=video&key={YOUR_API_KEY}

结果:

 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "\"DsOZ7qVJA4mxdTxZeNzis6uE6ck/enc3-yCp8APGcoiU_KH-mSKr4Yo\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "WVZpCdHq3Qg"
   }
  },

然后获取 videoID 值 WVZpCdHq3Qg 例如并将值添加到此 url:

https://www.youtube.com/embed/ + videoID
https://www.youtube.com/watch?v= + videoID

【讨论】:

  • 感谢您的回复,但我确定我明白了。我想要获取实际的视频网址,而不是嵌入网址。对于不是直播的视频,我可以获得实际的 mp4 网址。
  • 那个是看视频的网页,我要的是视频地址,实际视频,不是页面。
  • YouTube 禁止在您不是所有者的情况下下载视频You shall not copy, reproduce, distribute, transmit, broadcast, display, sell, license, or otherwise exploit any Content for any other purposes without the prior written consent of YouTube or the respective licensors of the Content.
  • @mpgn “或内容的相应许可方。”是该粘贴中的关键部分。您可以征得 YouTube 或直播者的同意。两者都是可行的。
  • @mpgn 他不得出于任何其他目的复制、分发、传输、广播、展示、出售、许可或以其他方式利用任何内容。他可能只是下载它作为他的私人收藏,并在他没有互联网连接时不时观看。
【解决方案2】:

您需要从视频的清单中获取 HLS m3u8 播放列表文件。有很多方法可以手动完成,但为简单起见,我将使用youtube-dl 工具来获取此信息。我将以这个直播为例:https://www.youtube.com/watch?v=_Gtc-GtLlTk

首先,获取视频的格式:

➜  ~ youtube-dl --list-formats https://www.youtube.com/watch\?v\=_Gtc-GtLlTk
[youtube] _Gtc-GtLlTk: Downloading webpage
[youtube] _Gtc-GtLlTk: Downloading video info webpage
[youtube] Downloading multifeed video (_Gtc-GtLlTk, aflWCT1tYL0) - add --no-playlist to just download video _Gtc-GtLlTk
[download] Downloading playlist: Southwest Florida Eagle Cam
[youtube] playlist Southwest Florida Eagle Cam: Collected 2 video ids (downloading 2 of them)
[download] Downloading video 1 of 2
[youtube] _Gtc-GtLlTk: Downloading webpage
[youtube] _Gtc-GtLlTk: Downloading video info webpage
[youtube] _Gtc-GtLlTk: Extracting video information
[youtube] _Gtc-GtLlTk: Downloading formats manifest
[youtube] _Gtc-GtLlTk: Downloading DASH manifest
[info] Available formats for _Gtc-GtLlTk:
format code  extension  resolution note
140          m4a        audio only DASH audio  144k , m4a_dash container, mp4a.40.2@128k (48000Hz)
160          mp4        256x144    DASH video  124k , avc1.42c00b, 30fps, video only
133          mp4        426x240    DASH video  258k , avc1.4d4015, 30fps, video only
134          mp4        640x360    DASH video  646k , avc1.4d401e, 30fps, video only
135          mp4        854x480    DASH video 1171k , avc1.4d401f, 30fps, video only
136          mp4        1280x720   DASH video 2326k , avc1.4d401f, 30fps, video only
137          mp4        1920x1080  DASH video 4347k , avc1.640028, 30fps, video only
151          mp4        72p        HLS , h264, aac  @ 24k
132          mp4        240p       HLS , h264, aac  @ 48k
92           mp4        240p       HLS , h264, aac  @ 48k
93           mp4        360p       HLS , h264, aac  @128k
94           mp4        480p       HLS , h264, aac  @128k
95           mp4        720p       HLS , h264, aac  @256k
96           mp4        1080p      HLS , h264, aac  @256k (best)
[download] Downloading video 2 of 2
[youtube] aflWCT1tYL0: Downloading webpage
[youtube] aflWCT1tYL0: Downloading video info webpage
[youtube] aflWCT1tYL0: Extracting video information
[youtube] aflWCT1tYL0: Downloading formats manifest
[youtube] aflWCT1tYL0: Downloading DASH manifest
[info] Available formats for aflWCT1tYL0:
format code  extension  resolution note
140          m4a        audio only DASH audio  144k , m4a_dash container, mp4a.40.2@128k (48000Hz)
160          mp4        256x144    DASH video  124k , avc1.42c00b, 30fps, video only
133          mp4        426x240    DASH video  258k , avc1.4d4015, 30fps, video only
134          mp4        640x360    DASH video  646k , avc1.4d401e, 30fps, video only
135          mp4        854x480    DASH video 1171k , avc1.4d401f, 30fps, video only
136          mp4        1280x720   DASH video 2326k , avc1.4d401f, 30fps, video only
151          mp4        72p        HLS , h264, aac  @ 24k
132          mp4        240p       HLS , h264, aac  @ 48k
92           mp4        240p       HLS , h264, aac  @ 48k
93           mp4        360p       HLS , h264, aac  @128k
94           mp4        480p       HLS , h264, aac  @128k
95           mp4        720p       HLS , h264, aac  @256k (best)
[download] Finished downloading playlist: Southwest Florida Eagle Cam

在这种情况下,有两个视频,因为直播包含两个摄像头。从这里,我们需要获取特定流的 HLS URL。使用-f 传递您想要观看的格式,使用-g 获取该流的URL:

➜  ~ youtube-dl -f 95 -g https://www.youtube.com/watch\?v\=_Gtc-GtLlTk
https://manifest.googlevideo.com/api/manifest/hls_playlist/id/_Gtc-GtLlTk.2/itag/95/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/cmbypass/yes/gir/yes/dg_shard/X0d0Yy1HdExsVGsuMg.95/hls_chunk_host/r1---sn-ab5l6ne6.googlevideo.com/playlist_type/LIVE/gcr/us/pmbypass/yes/mm/32/mn/sn-ab5l6ne6/ms/lv/mv/m/pl/20/dover/3/sver/3/fexp/9408495,9410706,9416126,9418581,9420452,9422596,9422780,9423059,9423661,9423662,9425349,9425959,9426661,9426720,9427325,9428422,9429306/upn/xmL7zNht848/mt/1456412649/ip/64.125.177.124/ipbits/0/expire/1456434315/sparams/ip,ipbits,expire,id,itag,source,requiressl,ratebypass,live,cmbypass,gir,dg_shard,hls_chunk_host,playlist_type,gcr,pmbypass,mm,mn,ms,mv,pl/signature/7E48A727654105FF82E158154FCBA7569D52521B.1FA117183C664F00B7508DDB81274644F520C27F/key/dg_yt0/playlist/index.m3u8
https://manifest.googlevideo.com/api/manifest/hls_playlist/id/aflWCT1tYL0.2/itag/95/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/cmbypass/yes/gir/yes/dg_shard/YWZsV0NUMXRZTDAuMg.95/hls_chunk_host/r13---sn-ab5l6n7y.googlevideo.com/pmbypass/yes/playlist_type/LIVE/gcr/us/mm/32/mn/sn-ab5l6n7y/ms/lv/mv/m/pl/20/dover/3/sver/3/upn/vdBkD9lrq8Q/fexp/9408495,9410706,9416126,9418581,9420452,9422596,9422780,9423059,9423661,9423662,9425349,9425959,9426661,9426720,9427325,9428422,9429306/mt/1456412649/ip/64.125.177.124/ipbits/0/expire/1456434316/sparams/ip,ipbits,expire,id,itag,source,requiressl,ratebypass,live,cmbypass,gir,dg_shard,hls_chunk_host,pmbypass,playlist_type,gcr,mm,mn,ms,mv,pl/signature/4E83CD2DB23C2331CE349CE9AFE806C8293A01ED.880FD2E253FAC8FA56FAA304C78BD1D62F9D22B4/key/dg_yt0/playlist/index.m3u8

这些是您的 HLS m3u8 播放列表,每个与直播相关联的摄像机一个。

没有 youtube-dl,您的流程可能如下所示:

获取您的视频 ID 并向get_video_info 端点发出 GET 请求:

HTTP GET: https://www.youtube.com/get_video_info?&video_id=_Gtc-GtLlTk&el=info&ps=default&eurl=&gl=US&hl=en

在响应中,hlsvp 值将是 m3u8 HLS 播放列表的链接:

https://manifest.googlevideo.com/api/manifest/hls_variant/maudio/1/ipbits/0/key/yt6/ip/64.125.177.124/gcr/us/source/yt_live_broadcast/upn/BYS1YGuQtYI/id/_Gtc-GtLlTk.2/fexp/9416126%2C9416984%2C9417367%2C9420452%2C9422596%2C9423039%2C9423661%2C9423662%2C9423923%2C9425346%2C9427672%2C9428946%2C9429162/sparams/gcr%2Cid%2Cip%2Cipbits%2Citag%2Cmaudio%2Cplaylist_type%2Cpmbypass%2Csource%2Cexpire/sver/3/expire/1456449859/pmbypass/yes/playlist_type/LIVE/itag/0/signature/1E6874232CCAC397B601051699A03DC5A32F66D9.1CABCD9BFC87A2A886A29B86CF877077DD1AEEAA/file/index.m3u8

【讨论】:

  • @mpgn 我理解你的感受,但实际上不可能追随所有违反 YouTube 服务条款的人。我去过那儿。尤其是在移动设备上,看看使用 XCDYouTubeKit 等工具的人数。如果您构建了有用的东西,即使您违反了他们的 TOS,即使 YouTube 也不会追随您。在这个问题的背景下,出于个人目的,我毫不犹豫地提供这个答案。
  • @JAL 感谢您提供的信息,但是如果没有该工具,我该如何获取这些值呢?我正在尝试从 Java 以编程方式执行此操作。我正在使用此代码,但它似乎不起作用github.com/freecode/YouTube-Downloader/blob/master/src/…
  • @mntgoat 您可以查看 youtube-dl 源代码并尝试将其翻译成 Java。我已经编辑了我的答案,以提供获取 m3u8 URL 所需的 Web 请求的概述。
  • @mpgn 如果我能找到它们属于我的部分
  • 嘿!我运行那个流! dickpritchettrealestate.com/eagle-feed.html.
【解决方案3】:

此网址返回播放器实际video_id

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

UCkA21M22vGK9GtAvq3DvSlA 是您的频道 ID。 您可以在 YouTube 帐户的“我的频道”链接中找到它。

或这里https://www.youtube.com/account_advanced

【讨论】:

  • 你节省了我的时间,伙计。谢谢 。 ?
【解决方案4】:

For those who: 想在你的安卓系外行星上观看来自 youtube 的直播视频,然后执行以下操作:https://exoplayer.dev/hls.html

阅读以上文档,在android studio中创建ExoPlayer。

Careful: 从 youtube 直播视频链接获取 HLS Url: 实时 URL 示例:https://youtu.be/21X5lGlDOfg .复制 URL 的常见错误:https://www.youtube.com/watch?v=FdQA-pE2luQ。您可以看到第二个是指向可以直播但仍然是视频的视频的链接。这不是 HLS。

USAGE: 只需调用convertLinkToHls() 而不是初始化播放器,因为我们在其中调用了initializePlayer()

这里我们称之为 GET 请求:

void convertLinkToHls(String youtubeLiveLink) {

        final String[] hlsLink = {""};

        Runnable runnableCode = () -> {
            try {
                URL url = new URL(youtubeLiveLink);
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer content = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    content.append(inputLine);
                }
                in.close();

                if(youtubeLiveLink.contains("m3u8")){
                    hlsLink[0] = youtubeLiveLink;
                }else{
                    hlsLink[0] = extractHlsUrl(content.toString());
                }
                con.disconnect();
            } catch (Exception e) {
                hlsLink[0] = youtubeLiveLink;
                e.printStackTrace();
                Log.d("TAG", "convertLinkToHls: " +
                        ": Reason is that the link is not a live url," +
                        "copy the link by open video then right click, copy video url from youtube.");
            }
            //extractHlsUrl(response);
        };

        Thread requestThread = new Thread(runnableCode);
        requestThread.start();

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (!requestThread.isAlive()) {
                    // hlsLink[0]
                    runOnUiThread(() -> {
                        et_url.setText(hlsLink[0]);
                        initializePlayer();
                    });
                    timer.cancel();

                    /* Here initialize the player,
                     * make you do it in runOnUiTHread() */
                }
            }
        }, 1000, 1000);
    }

这里我们从 GET 响应中提取链接:


    private static String extractHlsUrl(String response) {

        String keyName = "hlsManifestUrl";

        if (response.contains(keyName)) {
            int index = response.indexOf(keyName);
            index = index + 17;

            int lastIndex = index;
            while (lastIndex < response.length()) {
                if ((response.charAt(lastIndex) == '8') &&
                        (response.charAt(lastIndex - 1) == 'u') &&
                        (response.charAt(lastIndex - 2) == '3') &&
                        (response.charAt(lastIndex - 3) == 'm')) {
                    break;
                }

                lastIndex++;
            }
            return response.substring(index, lastIndex + 1);
        }

        return null;
    }

这里我们为 HLS 流初始化 Exo 播放器:

    private void initializePlayer() {

        player = new SimpleExoPlayer.Builder(this)
                .build();
        playerView.setPlayer(player);

        String tempUrl = et_url.getText().toString();

        // Create a data source factory.
        DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory();
        // Create a HLS media source pointing to a playlist uri.
        HlsMediaSource hlsMediaSource =
                new HlsMediaSource.Factory(dataSourceFactory)
                        .createMediaSource(MediaItem.fromUri(tempUrl));

        player.setMediaSource(hlsMediaSource);
        player.setPlayWhenReady(playWhenReady);
        player.seekTo(currentWindow, playbackPosition);
        player.prepare();
        player.play();
    }

您也可以在我们提取链接之前显示进度条,通常需要 300 毫秒。此代码适用于 java 和 android。因为我使用了传统的方式来获取后台任务的请求和线程。

如果链接已经是 m3u8 怎么办? 然后在不做任何更改的情况下,我们将链接到播放器,因此它适用于 youtube 直播视频和任何其他 m3u8 链接。

这背后的概念是什么? 我正在使用实时视频 URL 调用获取请求,并响应 ~400KB 的 StringBuffer,我从中提取标签 hlsManifestUrl。没有火箭科学。

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2018-01-21
    • 2013-02-06
    • 1970-01-01
    • 2017-01-09
    • 2017-05-27
    • 2016-04-26
    • 2018-03-12
    • 2012-05-22
    相关资源
    最近更新 更多