web-dev-qa-db-ja.com

「youtube-dl」を使用してYouTubeビデオのURLを取得するのは、ビデオをダウンロードせずに遅くなります

Youtube-dlを使用してURLを取得し、動画をダウンロードしない「シミュレーション」オプション-gを取得します。

そこで、次のコマンドを発行しました。

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秒かかることです。
高速化する方法はありますか?

時間は仕事に費やす

コマンドがハングしたり、時間の無駄になるのを待ったりしません。
実際には時間のかかる作業を行います。ほとんどの場合、複数の小さなネットワーク遅延を加算するのに時間がかかります。ただし、YouTube側で遅延が発生する可能性もあります。

必要なHTMLをダウンロードするのに要する時間です。
コマンドは、少なくとも2つのHTTPリクエストを次々に、そしておそらくそれ以上行う必要があります。

そのため、速度が遅い場合は、すでにリクエストの数を掛けています。

私にとっては、非常に高速な回線では1.5秒かかります。これは8秒からそれほど遠くありません。


調べる方法

調べるために使用したコマンドを示します。

サンプルをよりきれいにするために、URLに変数を使用します。

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

コマンドの継続時間を測定したい。コマンドtimeを使用するには、コマンドとシェル組み込みコマンドを混同しないように注意する必要があります。小さな関数を使用して、行を短くします。

$ 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

はい、1.5秒です。質問よりも高速ですが、それほど高速ではありません。しかし、それはどのように時間を費やしていますか?たぶん、それは何らかの隠された方法でビデオをダウンロードして、それを捨てますか?ビデオは360pで11分です。オプションなしでダウンロードするだけで約13秒かかります-10倍長くなります。
詳細オプション-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は、独自の構成設定に時間がかかるようです。探している遅延ではなく、1/4秒程度です。しかし、それから学ぶことができるのは、youtube-dl実装自体が遅いかもしれないということです。
メッセージの後、結果URLが印刷されるまで何も起こりません。そのため、興味深い部分はまだありません。
オプション-gは、そのセミシークレットURLを見つけるという複雑な部分を実行し、それを印刷するという意味でビデオダウンロードを「シミュレート」しますが、実際のダウンロードは最終的にスキップします。 URLを出力しない同様のオプション-sがあり、それ以外は同様のようです。ほぼ同じ時間で十分に似ていると仮定しましょう。確認する必要があります。

$ 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と同じ時間を要するので、テストのために置き換えても構いません。
さらに興味深いのは、出力が増えたことです。そして、興味深いタイミングで印刷されます:行は互いに同様の遅延で印刷されるので、実際に私たちが探している時間を費やしているアクションについてであるようです。
メッセージから、少なくとも2つのWebページがダウンロードされます。しかし、Wordの「ページ」は単一のHTTP要求と単一のHTMLドキュメントを意味するものではないと想定できます。

何を学びましたか?

要点は、プログラムの作業には実際に時間がかかり、何かを待ったり、ハングしたりしないことです。
また、同様の時間がかかる複数のステップがあります。計算することはあまりないので、それは何らかの方法でのネットワーク往復であり、合計します。
つまり、接続の遅延はここでのみ重要です。接続のスループットは無関係です。

インターネット接続をより高速にして、データを倍速で転送できるようにする場合は、まったく役に立ちません。しかし、ping倍良くなれば、もっと速くなります。
ただし、インターネットサービスプロバイダーへの「ping」時間ではありません。 YouTubeへのping時間は重要です。変更することは不可能かもしれません。

興味深いことに、ビデオをダウンロードする次のステップでは、高速回線の要件はまったく逆です。待ち時間はまったく関係なく、スループットが本当に重要です。


まだ疲れていませんか?

時間を実際に費やしているものを理解するために、さらに詳細が必要ですか?
次のステップは、HTTP接続をトレースすることです。たとえばリダイレクトなど、2つ以上のラウンドトリップが表示されると思われます。 wireshark、またはロギングHTTPプロキシ、またはstraceを使用して、接続または書き込みのシステムコールをカウントすることができます。

今日、私たちは両方とも、ネットワーキングのうさぎの穴を十分に深く見てきました。

9
Volker Siegel

ただ:

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

ソース

6
tictac

別の理由があるかもしれません。 youtube-dlは、zip形式のPythonアプリケーションとして配布されます。実行するたびに、それを抽出して実行します。

unzipコマンドを使用して手動で抽出できます。次に、__main__.pyを実行するのと同じようにyoutube-dlを実行します。 Piなどの低電力コンピューターでは、パフォーマンスが著しく向上します。

1
nmrugg