如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url

Posted

技术标签:

【中文标题】如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url【英文标题】:How to get the mp4 url for Youtube videos using Youtube v3 API 【发布时间】:2015-10-12 13:07:46 【问题描述】:

如何获取完整的 mp4 url​​,以便使用除 Youtube 之外的其他来源从我的应用程序中的实际位置播放视频。 gdata/youtube API 已被弃用,所以我遇到了麻烦。任何帮助将不胜感激。谢谢。

【问题讨论】:

[php] 此解决方案基于最新的 Youtube 网站更新 (2019)。 ***.com/questions/55078023/… 【参考方案1】:

我做了一个非常简单的 API:https://gist.github.com/egyjs/9e60f1ae3168c38cc0f0054c15cd6a83

例如: YouTube 视频链接:https://www.youtube.com/watch?v=**YGCLs9Bt_KY**

现在获取直接链接

您需要像这样调用 api(将 example.com 更改为您的站点):

https://example.com/?url=https://www.youtube.com/watch?v=YGCLs9Bt_KY

返回:

[
    
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&signature=81D86D3BC3D34D8A3B865464BE7BC54F34C1B0BC.7316033C2DD2F65E4D345CFA890257B63D7FE2A2&mt=1522999783&expire=1523021537&sparams=dur%2Cei%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&requiressl=yes&ei=gSLHWvuxDMOUVYaTqYgB&dur=244.204&pl=22&itag=22&ip=185.27.134.50&lmt=1522960451860848&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&ratebypass=yes&ms=au%2Conr&fvip=2&source=youtube&mv=m&ipbits=0&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&mime=video%2Fmp4&c=WEB&initcwndbps=710000",
        "quality": "hd720",
        "itag": "22",
        "type": "video\/mp4; codecs=\"avc1.64001F, mp4a.40.2\""
    ,
    
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&itag=43&ratebypass=yes&fvip=2&ipbits=0&mime=video%2Fwebm&initcwndbps=710000&signature=71DC48B9BF4B2E3ED46FE0A4CD36FE027DACF31E.4624B7B4BCB947336CEB029E9958B136F79759EB&clen=24203231&requiressl=yes&dur=0.000&pl=22&ip=185.27.134.50&lmt=1522961642553275&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "medium",
        "itag": "43",
        "type": "video\/webm; codecs=\"vp8.0, vorbis\""
    ,
    
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&itag=18&ratebypass=yes&fvip=2&ipbits=0&mime=video%2Fmp4&initcwndbps=710000&signature=C83DE33E3DC80981A65DB3FE4E6B3A48BF7500E4.361D0EE6210B30D3D3A80F43228DEF1BD20691A4&clen=15954979&requiressl=yes&dur=244.204&pl=22&ip=185.27.134.50&lmt=1522960340235683&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "medium",
        "itag": "18",
        "type": "video\/mp4; codecs=\"avc1.42001E, mp4a.40.2\""
    ,
    
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csource%2Cexpire&itag=36&fvip=2&ipbits=0&mime=video%2F3gpp&initcwndbps=710000&signature=3E993D911492DA039A16BB26182ACDC6C6A04FCC.BFB9728C71CD03970B0F15AFD51A7355F9D3F899&clen=6759799&requiressl=yes&dur=244.273&pl=22&ip=185.27.134.50&lmt=1522957367267598&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "small",
        "itag": "36",
        "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
    ,
    
        "url": "https:\/\/r10---sn-aigllnlr.googlevideo.com\/videoplayback?key=yt6&mt=1522999783&gir=yes&expire=1523021537&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Crequiressl%2Csource%2Cexpire&itag=17&fvip=2&ipbits=0&mime=video%2F3gpp&initcwndbps=710000&signature=810D13A2C507A4EA220E6DA895B39B237FA22DAF.898D020851087CF3C10BC6E3ED7360736A239904&clen=2443931&requiressl=yes&dur=244.273&pl=22&ip=185.27.134.50&lmt=1522957365473654&ei=gSLHWvuxDMOUVYaTqYgB&ms=au%2Conr&source=youtube&mv=m&id=o-AAoaDzyDCVXS404wfqZoCIdolGU-NM3-4yDxC0t868iL&mm=31%2C26&mn=sn-aigllnlr%2Csn-5hne6nsy&c=WEB",
        "quality": "small",
        "itag": "17",
        "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\""
    
]

更新:

查看源代码:

GIST:https://gist.github.com/egyjs/9e60f1ae3168c38cc0f0054c15cd6a83

【讨论】:

为什么你的 api 不拉 1080 或 4K 链接? 我已经在本地添加了安卓版本,你可以检查一下。 @abdo 答案是来源参考 如果您以后只是在此处粘贴您的代码,而不是使用您自己的广告链接到某些东西会很好 @DevinSmith 如果您在 GitHub Gist 上看到广告,我可能有一些关于您计算机上可能运行的软件种类的坏消息。 @MauricioAriasOlave 不幸的是我没有服务器可以上传代码【参考方案2】:

对不起,先生,您无法使用 youtube api v3 执行此操作。您必须使用不是 api 的 youtube 网址,但在这里您可以获取与此相关的所有视频。 看 http://www.youtube.com/get_video_info?&video_id='。 $my_id.'&asv=3&el=detailpage&hl=en_US

或者您可以获取所有视频下载链接,即使它是私人的或您所在国家/地区不允许 第一:去任何一个youtube视频链接的网页https://www.youtube.com/watch?v=9mdJV5-eias

2nd : 查看该页面的源代码

第 3 行:188 或 187 行,您可以在其中找到源 javascript 代码,其中还提供 mp4 格式的视频的位置。

你可以通过 simplehtmldom 和一些 php 函数来做第二个想法。第一个可以通过使用 curl 来获得,这很容易,但通过 php 有点困难。谢谢,希望对您有所帮助。

【讨论】:

【参考方案3】:

对于本地到 Java/android,这是我实现这一点的方法,归功于 @abdo-el-zahaby 我将他的 php 脚本转换为使用 okhttp 客户端获取 url 的等效 java 代码

final String videoInfoUrl = "http://www.youtube.com/get_video_info?video_id=some_video_id&el=embedded&ps=default&eurl=&gl=US&hl=en";
                Request request = new Request.Builder()
                        .cacheControl(CacheControl.FORCE_NETWORK)
                        .url(videoInfoUrl)
                        .build();
                final Response response = okHttpClient.newCall(request).execute();
                InputStream inputStream = response.body().byteStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                final StringBuilder contentBuilder = new StringBuilder();
                while ((line = bufferedReader.readLine()) != null) 
                    contentBuilder.append(line);
                

                final String streamKey = "url_encoded_fmt_stream_map";
                final Map<String, String> map = new HashMap<>();
                final String content = contentBuilder.toString();
                String[] ampSplit = content.split("&");
                for (String s : ampSplit) 
                    printDivider();
                    final String[] equalsPlit = s.split("=");
                    if (equalsPlit.length >= 2) 
                        String key;
                        String value;
                        key = equalsPlit[0];
                        value = equalsPlit[1];
                        map.put(key, value);
                    
                    printDivider();
                
                int count = 0;
                if (map.containsKey(streamKey)) 
                    String[] streams = map.get(streamKey).split(",");
                    for (String stream : streams) 

                        String[] streamSplit = stream.split("&");
                        for (String s : streamSplit) 
                            printDivider();
                            final String urlDecoded = URLDecoder.decode(s, "UTF-8");
                            String[] details = urlDecoded.split(",");
                            for (String detail : details) 
                                System.out.println("Detail " + URLDecoder.decode(detail, "UTF-8"));
                                final String urlContent= URLDecoder.decode(detail, "UTF-8");
                                final String url = urlContent.substring(urlContent.indexOf("http"), urlContent.indexOf(";"));
                                mp4Url.put(Integer.toString(count++), url);
                            

                        
                        printDivider();
                    
                

这是我用来下载和存储在 sdcard/内存中的代码

Request request = new Request.Builder()
              .cacheControl(CacheControl.FORCE_NETWORK)
              .url(url)
              .build();
          final Response response = okHttpClient.newCall(request).execute();
          InputStream inputStream = response.body().byteStream();
          final File newFile = new File(location);
          boolean created = newFile.createNewFile();
          System.out.println(location + " new file created: " + created);

          byte[] buff = new byte[4096];
          long downloaded = 0;
          long target = response.body().contentLength();

          System.out.println("File size is: " + Long.toString(target));
          OutputStream outStream = new FileOutputStream(newFile);
          while (true) 

            int read = inputStream.read(buff);
            if (read == -1) 
              break;
            
            outStream.write(buff, 0, read);
            //write buff
            downloaded += read;
          

          System.out.println("Target: " + target +", Downloaded: " + downloaded);
          outStream.flush();

【讨论】:

让它成为一个真正的项目,你怎么看 :) 嗨,你确定它工作正常吗?我得到并索引越界异常。你能把它放在一个要点中吗?【参考方案4】:

我不知道它是如何工作的,但请查看https://podsync.net/。

当您输入一个 youtube 播放列表链接时,它会发挥一些作用并生成一个 mp4 链接以供播客捕获者使用。检查返回的 xml 文件,您会看到播放列表中每个视频的行如下:

<enclosure url="http://podsync.net/download/[random-letters]/[video-id].mp4" length="x" type="video/mp4"></enclosure>

根据我的经验,无论您使用什么视频 ID,该 URL 都有效。

【讨论】:

以上是关于如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url的主要内容,如果未能解决你的问题,请参考以下文章

如何使用新的 YouTube Data API (V3) 获取某个频道的上传视频列表?

如何使用新的 YouTube Data API (V3) 获取某个频道的上传视频列表?

如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url

如何在 YouTube api v3 中获取 YouTube 视频的 cc 字幕

在搜索 youtube api 3 中获取号码订阅频道

如何使用 Ajax 和 JSON 在 javascript 中使用 v3 URL API 获取 Youtube 视频标题