使用“ youtube-dl”获取YouTube视频的URL很慢,无需下载视频


10

我想使用youtube-dl和-g不下载视频的“模拟”选项来获取URL 。

所以我给出了以下命令:

youtube-dl -g https://www.youtube.com/watch?v=k4JGSAmu4lg

在7到8秒后给出以下输出

https://r20---sn-cvh7zn7d.googlevideo.com/videoplayback?initcwndbps=1113000&mt=1408702970&requiressl=yes&ipbits=0&sver=3&fexp=901454%2C902408%2C919145%2C924626%2C927622%2C927904%2C931330%2C931983%2C934024%2C934030%2C934804%2C945118%2C945308%2C946023%2C951914&ratebypass=yes&signature=38F111D46D72FFC50B47D50B3C9A631099BF5F83.FA134C91F407989B95ACADC1F1F6946B8F18C158&upn=tU0u5t7A2Uw&sparams=id%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Cmm%2Cms%2Cmv%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mm=31&expire=1408724634&id=o-AJNPuDp9TKMKiwzUwvSk76W7JdA0cx0bRSum9mPJJ7Vo&mv=u&source=youtube&ms=au&key=yt5&ip=115.113.1.50&itag=18

但是问题是查询URL大约需要7到8秒。
有什么办法可以使其更快?


确切地说,“模拟”是什么意思?
Volker Siegel

当我们给选项-g加上youtube-dl后,它将生成(模拟)URL,如我在输出中提到的那样。
bharath kumar reddy bojja,2014年

Answers:


9

时间花在做工作上

该命令不会挂起或等待浪费时间,
它确实会花费时间。通过增加多个小的网络延迟,很可能需要时间。但也可能是youtube方面的延迟加起来了。

只是下载所需HTML所需的时间;
该命令至少需要发出两个HTTP请求,一个接一个,甚至可能更多。

因此,如果一切缓慢,则将其乘以已经请求的数量。

对我来说,在一条非常快的线上需要1.5秒-与8秒相差不远。


如何找出

我将显示用于查找的命令:

为了使示例更简洁,我们对URL使用一个变量:

$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"

我们要测量命令的持续时间;使用该命令时time需要注意不要混淆该命令和内置的shell。我们使用一个小函数来缩短行数:

$ t(){/usr/bin/time -f 'Time: %es' "$@";}

您的命令写出视频文件的URL(截断为80列):

$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823

我们来衡量一下在我的计算机上运行所花费的时间:

$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s

好,一个半秒。比问题快,但没有那么快。但是如何花费时间呢?也许它确实以某种隐藏的方式下载了视频并丢弃了它?视频是360p的11分钟。仅下载它就没有选项,大约需要13秒-延长了十倍。
需要仔细了解一下,使用verbose选项-v

$ t youtube-dl -v -g "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-g', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?sparams=id%2Cinitcwn
Time: 1.40s

哦,打印“ [debug]”行之前会有一些延迟。看起来youtube-dl要花一些时间进行自己的配置设置。这是四分之一秒左右,而不是我们正在寻找的延迟。但是我们可以从中学到的是,youtube-dl实现本身可能很慢。
消息之后,直到打印结果URL为止,什么都不会发生。因此,我们仍然看不到有趣的部分。从某种意义上说,
该选项-g是“模拟”视频下载,因为它完成了查找半秘密URL的复杂部分,将其打印出来,但最后跳过了实际下载。有一个类似的选项-s,它不输出URL,否则看起来类似。假设它花费的时间差不多,就足够相似了。我们需要检查一下。

$ t youtube-dl -v -s "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-s', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
[youtube] Setting language
[youtube] k4JGSAmu4lg: Downloading webpage
[youtube] k4JGSAmu4lg: Downloading video info webpage
[youtube] k4JGSAmu4lg: Extracting video information
Time: 1.45s

好的,-s与的时间相同-g,因此可以替换它们进行测试。
更有趣的是,我们现在获得了更多的输出。它的打印时机很有趣:行的打印时延彼此相似,因此看来它们与实际花费我们寻找时间的动作有关。
从消息中下载至少两个网页。但是我们可以假设“页面”一词并不意味着一个HTTP请求和一个HTML文档。

我们学到了什么?

要点是,程序的工作确实需要时间,它不是在等待或挂起。
同样,我们看到多个步骤花费了相似的时间。没什么可计算的,因此网络往返以某种方式加起来。
这意味着,连接的延迟仅在此处很重要。连接的吞吐量无关紧要。

如果您可以加快Internet连接的速度,使其可以以两倍的速度传输数据,那根本没有帮助。但是,如果您能度过美好的ping时光,那将使其更快。
不过,这与向互联网服务提供商“ ping”时间无关;一直到YouTube的ping时间都很重要-可能无法更改。

有趣的是,对于下一步,下载视频,对快速线路的要求正好相反:延迟根本不相关,而吞吐量确实很重要。


还不累吗

想要更多细节来了解实际花费的时间吗?
下一步将是跟踪HTTP连接。我怀疑它可能会显示比两次更多的往返,例如重定向。您可以使用wireshark或日志HTTP代理,或者strace仅计算用于连接或写入的系统调用。

时至今日,我们俩都已经深入研究了网络的无用功。


那么,这么长的时间可能是什么原因呢?是否由于网络连接缓慢?
bharath kumar reddy bojja,2014年

取决于速度有多慢-这是什么问题?请等待我的示例的详细信息,我正在编写它们。
Volker Siegel 2014年

我的问题是:延迟是否是由于网络连接速度慢?
bharath kumar reddy bojja,2014年

是的,部分。这个问题并不像听起来那么简单;)并不是关于连接的吞吐量。延迟在这里很重要。据我所知,至少有3次HTTP往返-也许更多。所有延迟均乘以该数字,即为总和。我对您的联系一无所知;YouTube端的运行速度可能很慢,很难衡量。在网络上尝试其他一些您知道它们有多快的事物,然后检查它是否变慢或正常。
Volker Siegel 2014年

因此,我添加了一些详细信息:)
Volker Siegel 2014年

6

只要做一个:

youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=k4JGSAmu4lg' | jq -r '.id' | sed 's_^_https://youtube.com/v/_'

资源


1

可能还有另一个原因。youtube-dl作为压缩的Python应用程序分发。每次您运行它时,它都会提取并运行它。

您可以使用unzip命令手动将其提取。然后__main__.py按您的方式运行youtube-dl。在Pi等低功耗计算机上,这将显着提高性能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.