YouTube videosunun URL'sini `youtube-dl` ile almak video indirmeden yavaştır


10

URL'yi youtube-dl ve -gvideoyu indirmeyen "simüle" seçeneğini kullanarak almak istiyorum .

Bu yüzden aşağıdaki komutu verdim:

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

7 ila 8 saniye sonra aşağıdaki çıktıyı verdi

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

Ancak sorun URL'yi sorgulamak yaklaşık 7 ila 8 saniye sürüyor.
Daha hızlı olabilmesinin bir yolu var mı?


"Simüle" ile tam olarak ne demek istiyorsun?
Volker Siegel

-g ve ardından youtube-dl seçeneğini verdiğimizde, çıkış olarak bahsettiğim gibi URL üretir (simüle eder).
bharath kumar reddy bojja

Yanıtlar:


9

İş yapmak için zaman harcamak

Komut zaman kaybetmeden bir şey beklemez veya beklemez,
aslında zaman alan işleri yapar; Büyük olasılıkla birden çok küçük ağ gecikmesi ekleyerek zaman alır. Ancak youtube tarafında gecikmeler de olabilir.

Gereken HTML'yi indirmek için gereken zamanın;
Komutun birbiri ardına ve muhtemelen daha fazla olmak üzere en az iki HTTP isteği yapması gerekir.

Dolayısıyla, herhangi bir şey yavaşsa, zaten talep sayısıyla çarpılır.

Benim için çok hızlı bir çizgide 1,5 saniye sürüyor - bu 8 saniyeden çok uzak değil.


Nasıl öğrenilir

Öğrenmek için kullandığım komutları göstereceğim:

Örnekleri daha düzenli hale getirmek için URL için bir değişken kullanıyoruz:

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

Komutların süresini ölçmek istiyoruz; Komutu kullanmak, komutu timeve kabuk yerleşimini karıştırmamaya dikkat etmelidir. Hatları kısaltmak için küçük bir işlev kullanıyoruz:

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

Komutunuz video dosyasının URL'sini yazar (80 sütuna kesilmiş):

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

Bilgisayarımda çalıştırmak için gereken süreyi ölçelim:

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

Tamam, bir buçuk saniye. Sorudan daha hızlı, ama o kadar hızlı değil. Ama zamanı nasıl geçiriyor? Belki videoyu gizli bir şekilde indirip atar? Video 360p'de 11 dakikadır. Hiçbir seçenek olmadan indirmeniz yaklaşık 13 saniye - on kat daha uzun sürer.
Ayrıntılı seçenekle daha yakından bakmanız gerekiyor -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, '[debug]' satırları basılmadan önce biraz gecikme yaşanıyor. Görünüşe göre youtube-dlkendi yapılandırma kurulumu için biraz zaman harcıyor. Aradığımız gecikme değil, saniyenin çeyreği kadar. Ancak bundan öğrenebileceğimiz, youtube-dluygulamanın kendisinin yavaş olabileceğidir.
Mesajlardan sonra, sonuç URL'si yazdırılana kadar hiçbir şey olmaz. Bu yüzden hala ilginç kısmı görmüyoruz.
Seçenek -g, video indirmeyi, yarı gizli URL'yi bulmanın karmaşık kısmını yaptığı, yazdırdığı, ancak sonunda gerçek indirmeyi atladığı anlamında "simüle etmektir". -sURL'yi vermeyen benzer bir seçenek vardır ve aksi halde benzer görünür. Diyelim ki aynı zaman alırsa yeterince benzer olduğunu varsayalım; Bunu kontrol etmeliyiz.

$ 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

Tamam, -saynı zamanı alır -g, bu yüzden onları test için değiştirmek iyidir.
Daha ilginç olan şu anda daha fazla üretimimiz var. Ve ilginç bir zamanlamayla basılıyor: Çizgiler birbirine benzer bir gecikmeyle basılıyor, bu yüzden aslında aradığımız zamanı alan eylemlerle ilgili görünüyorlar.
Mesajlardan en az iki web sayfası indirilir. Ancak "sayfa" sözcüğünün tek bir HTTP isteği ve tek bir HTML belgesi anlamına gelmeyeceğini varsayabiliriz.

Ne öğrendik?

Ana nokta, programın çalışması aslında zaman alıyor, bir şey beklemiyor veya asılı değil.
Ayrıca, benzer miktarlarda zaman alan birden fazla adım görüyoruz. Hesaplanacak çok şey yok, bu yüzden bir şekilde ağ gidiş dönüşleri toplanıyor.
Bu, bağlantımızın gecikmesinin sadece burada önemli olduğu anlamına gelir. Bağlantının verimi önemsizdir.

İnternet bağlantınızı daha hızlı hale getirirseniz, veriyi çift hızda aktarabilir - bu hiç yardımcı olmaz. Ancak daha iyi pingzamanlar alabiliyorsanız , bu çok daha hızlı olacaktır.
Yine de, internet servis sağlayıcınıza 'ping' saatleri ile ilgili değildir; Önemli olan YouTube'a kadar olan ping süresi - ve değiştirilmesi mümkün olmayabilir.

İlginç bir şekilde, bir sonraki adım için, bir video indirmek, hızlı bir hat için gereksinimler tam tersidir: gecikme hiç önemli değildir ve iş hacmi gerçekten önemlidir.


Henüz yorgun değil misiniz?

Zamanın gerçekten ne kadar zaman harcadığını anlamak için daha fazla ayrıntı ister misiniz?
Bir sonraki adım HTTP bağlantısını izlemek olacaktır; Örneğin, yönlendirmeler için ikiden çok daha fazla gidiş-dönüş gösterebileceğinden şüphelenirim. Bağlanmak veya yazmak için sistem çağrılarını saymak wiresharkya da bir günlük HTTP proxy'yi kullanabilirsiniz strace.

Bugün, ikimiz de ağ oluşturmanın tavşan deliğine yeterince derin baktık.


Peki, bu kadar uzun zamanın nedeni ne olabilir? Yavaş ağ bağlantısı nedeniyle mi?
bharath kumar reddy bojja

Ne kadar yavaş olduğuna bağlı - soru nedir? Örneklerimin ayrıntıları için bir dakika bekleyin, onları yazıyorum.
Volker Siegel

Sorum şu: Gecikme yavaş ağ bağlantısından mı kaynaklanıyor?
bharath kumar reddy bojja

Evet, kısmen. Soru, göründüğünden daha az basittir;) Bu, bağlantının çıkışı ile ilgili değildir. Burada gecikme önemlidir. Söyleyebileceğim kadarıyla, en az üç HTTP gidiş dönüş var - ama belki daha fazlası. Tüm gecikmeler bu sayı ile çarpılır, bu da toplanır. Bağlantınız hakkında hiçbir şey bilmiyorum; YouTube tarafında yavaş olabilir, ölçmeden söylemek zor olabilir. İnternette ne kadar hızlı olduklarını bildiğiniz başka şeyler deneyin ve daha yavaş ya da normal olup olmadığını kontrol edin.
Volker Siegel

Bu yüzden bazı detaylar ekledim :)
Volker Siegel

6

Sadece şunu yapın:

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

Kaynak


1

Başka bir neden olabilir. youtube-dlsıkıştırılmış bir Python uygulaması olarak dağıtılır. Her çalıştırdığınızda çıkarır ve çalıştırır.

unzipKomut ile manuel olarak çıkarabilirsiniz . Sonra koştuğun __main__.pygibi koş youtube-dl. Pi gibi düşük güçlü bir bilgisayarda, performansınızı belirgin şekilde artıracaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.