Das Abrufen der URL eines YouTube-Videos mit "youtube-dl" ist langsam, ohne dass ein Video heruntergeladen werden muss

10

Ich möchte die URL mit youtube-dl und die Option "simulieren" abrufen -g, mit der das Video nicht heruntergeladen wird.

Also gab ich folgenden Befehl:

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

Es gab die folgende Ausgabe nach 7 bis 8 Sekunden

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

Das Problem ist jedoch, dass das Abfragen der URL etwa 7 bis 8 Sekunden dauert.
Gibt es eine Möglichkeit, dass es schneller gehen kann?

Bharath Kumar Reddy Bojja
quelle
Was meinst du genau mit "simulieren"?
Volker Siegel
Wenn wir die Option -g gefolgt von youtube-dl angeben, wird eine URL generiert (simuliert), wie ich sie als Ausgabe erwähnt habe.
Bharath Kumar Reddy Bojja

Antworten:

9

Die Zeit wird für die Arbeit aufgewendet

Der Befehl bleibt nicht hängen oder wartet auf etwas, das Zeit verschwendet.
Er funktioniert tatsächlich, was Zeit braucht. Es dauert höchstwahrscheinlich einige Zeit, bis mehrere kleine Netzwerkverzögerungen addiert sind. Es kann aber auch sein, dass es auf der Youtube-Seite Verzögerungen gibt, die sich summieren.

Dass es nur die Zeit ist, die benötigt wird, um den benötigten HTML-Code herunterzuladen;
Der Befehl muss mindestens zwei HTTP-Anforderungen nacheinander und wahrscheinlich mehr stellen.

Wenn also etwas langsam ist, wird es mit der Anzahl der bereits vorhandenen Anforderungen multipliziert.

Für mich dauert es 1,5 Sekunden auf einer sehr schnellen Linie - das ist nicht weit von 8 Sekunden.


Wie man es herausfindet

Ich werde die Befehle zeigen, mit denen ich es herausgefunden habe:

Um die Beispiele übersichtlicher zu gestalten, verwenden wir eine Variable für die URL:

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

Wir wollen die Dauer von Befehlen messen; Bei der Verwendung des Befehls timemuss darauf geachtet werden, dass der Befehl und die integrierte Shell nicht verwechselt werden. Wir verwenden eine kleine Funktion, um die Zeilen kürzer zu machen:

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

Ihr Befehl schreibt die URL der Videodatei aus (auf 80 Spalten gekürzt):

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

Messen wir die Zeit, die für die Ausführung auf meinem Computer benötigt wird:

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

Ok, eineinhalb Sekunden. Schneller als in der Frage, aber nicht viel schneller. Aber wie verbringt es die Zeit? Vielleicht lädt es das Video auf versteckte Weise herunter und verwirft es? Das Video ist 11 Minuten in 360p. Das Herunterladen ohne Optionen dauert ungefähr 13 Sekunden - zehnmal länger.
Müssen Sie genauer hinsehen, mit der ausführlichen Option -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

Oh, es gibt eine gewisse Verzögerung, bevor die '[Debug]' - Zeilen gedruckt werden. Sieht so aus, als würde er youtube-dleinige Zeit für die Einrichtung seiner eigenen Konfiguration aufwenden. Es ist ungefähr eine Viertelsekunde, nicht die Verzögerung, nach der wir suchen. Wir können jedoch daraus lernen, dass die youtube-dlImplementierung selbst langsam sein kann.
Nach den Nachrichten passiert nichts, bis die Ergebnis-URL gedruckt wird. Wir sehen den interessanten Teil also immer noch nicht.
Die Option -gbesteht darin, den Video-Download in dem Sinne zu "simulieren", dass er den komplizierten Teil des Herausfindens dieser halbgeheimen URL erledigt, sie druckt und am Ende den eigentlichen Download überspringt. Es gibt eine ähnliche Option -s, die die URL nicht ausgibt und ansonsten ähnlich erscheint. Nehmen wir an, es ist ähnlich genug, wenn es ungefähr zur gleichen Zeit dauert. Wir müssen das überprüfen.

$ 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

Ok, -sdauert genauso lange wie -g, also ist es in Ordnung, sie zum Testen zu ersetzen.
Interessanter ist, dass wir jetzt mehr Output haben. Und es wird mit einem interessanten Timing gedruckt: Die Zeilen werden mit einer ähnlichen Verzögerung gedruckt, so dass es anscheinend um die Aktionen geht, die tatsächlich die Zeit in Anspruch nehmen, nach der wir suchen.
Aus den Nachrichten werden mindestens zwei Webseiten heruntergeladen. Wir können jedoch davon ausgehen, dass das Wort "Seite" keine einzelne HTTP-Anforderung und kein einzelnes HTML-Dokument bedeutet.

Was haben wir gelernt?

Der Hauptpunkt ist, dass die Arbeit des Programms tatsächlich Zeit braucht, nicht auf etwas wartet oder hängt.
Außerdem sehen wir mehrere Schritte, die ähnlich viel Zeit in Anspruch nehmen. Es gibt nicht viel zu berechnen, das sind also in gewisser Weise Netzwerk-Roundtrips, die sich summieren.
Das heißt, die Latenz unserer Verbindung ist nur hier wichtig. Der Durchsatz der Verbindung ist nur irrelevant.

Wenn Sie Ihre Internetverbindung beschleunigen würden, damit Daten mit doppelter Geschwindigkeit übertragen werden können, würde dies überhaupt nicht helfen. Aber wenn Sie bessere pingZeiten bekommen können, wird es viel schneller.
Es geht jedoch nicht darum, Ping-Zeiten an Ihren Internetdienstanbieter zu senden. Die Ping-Zeit bis hin zu YouTube ist wichtig - und kann möglicherweise nicht geändert werden.

Interessanterweise sind für den nächsten Schritt, das Herunterladen eines Videos, die Anforderungen für eine schnelle Leitung genau umgekehrt: Die Latenz ist überhaupt nicht relevant, und der Durchsatz ist wirklich wichtig.


Noch nicht müde?

Möchten Sie noch mehr Details erfahren, wofür die Zeit wirklich aufgewendet wird?
Der nächste Schritt wäre, die HTTP-Verbindung zu verfolgen. Ich würde vermuten, dass es viel mehr Hin- und Rückfahrten als zwei zeigt, zum Beispiel für Weiterleitungen. Sie können wiresharkeinen HTTP-Proxy stracefür die Protokollierung verwenden oder nur die Systemaufrufe zum Verbinden oder Schreiben zählen.

Für heute haben wir beide tief genug in das Kaninchenloch der Vernetzung geschaut.

Volker Siegel
quelle
Was könnte der Grund für diese lange Zeit sein? Liegt es an einer langsamen Netzwerkverbindung?
Bharath Kumar Reddy Bojja
Kommt darauf an, wie langsam es ist - was ist die Frage? Warten Sie eine Minute auf Details meiner Beispiele, ich schreibe sie.
Volker Siegel
Meine Frage ist: Ist die Verzögerung auf eine langsame Netzwerkverbindung zurückzuführen?
Bharath Kumar Reddy Bojja
Ja, teilweise. Die Frage ist weniger einfach als es sich anhört;) Es geht nicht um den Durchsatz der Verbindung. Die Latenz ist hier wichtig. Soweit ich weiß, gibt es mindestens drei HTTP-Roundtrips - aber vielleicht mehr. Alle Verzögerungen werden mit dieser Zahl multipliziert, was sich summiert. Ich weiß nichts über Ihre Verbindung; Auf YouTube könnte es langsam sein, ohne Messung schwer zu sagen. Probieren Sie einige andere Dinge im Internet aus, für die Sie wissen, wie schnell sie sind, und prüfen Sie, ob sie sich langsamer oder normal anfühlen.
Volker Siegel
Also habe ich einige Details hinzugefügt :)
Volker Siegel
6

Mach einfach ein:

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

Quelle

Tictac
quelle
1

Es könnte einen anderen Grund geben. youtube-dlwird als komprimierte Python-Anwendung verteilt. Jedes Mal, wenn Sie es ausführen, wird es extrahiert und dann ausgeführt.

Sie können es manuell mit dem unzipBefehl extrahieren . Dann renne so, __main__.pywie du rennen würdest youtube-dl. Auf einem Computer mit geringem Stromverbrauch wie dem Pi wird dies Ihre Leistung spürbar steigern.

nmrugg
quelle