Nhận URL của video YouTube với `youtube-dl` rất chậm, không cần tải xuống video


10

Tôi muốn nhận URL bằng youtube-dl và tùy chọn "mô phỏng" -gkhông tải xuống video.

Vì vậy, tôi đã đưa ra lệnh sau:

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

Nó cho đầu ra sau 7 đến 8 giây

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

Nhưng vấn đề là mất khoảng 7 đến 8 giây để truy vấn URL.
Có cách nào để nó có thể nhanh hơn?


Chính xác thì bạn có ý nghĩa gì với "mô phỏng"?
Volker Siegel

khi chúng tôi cung cấp tùy chọn -g theo sau là youtube-dl, nó sẽ tạo URL (mô phỏng) như tôi đã đề cập dưới dạng đầu ra.
bharath kumar reddy bojja

Câu trả lời:


9

Thời gian dành cho công việc

Lệnh không treo hoặc chờ đợi một cái gì đó lãng phí thời gian,
nó thực sự làm việc mà mất thời gian; Nó có thể mất thời gian bằng cách thêm nhiều độ trễ mạng nhỏ. Nhưng nó cũng có thể có sự chậm trễ ở phía youtube, điều đó cộng lại.

Rằng chỉ cần thời gian để tải xuống HTML cần thiết;
Lệnh cần thực hiện ít nhất hai yêu cầu HTTP, lần lượt từng yêu cầu và có thể nhiều hơn nữa.

Vì vậy, nếu bất cứ điều gì chậm, nó sẽ nhân với số lượng yêu cầu.

Đối với tôi, phải mất 1,5 giây trên một dòng rất nhanh - đó không phải là xa từ 8 giây.


Làm thế nào để tìm hiểu

Tôi sẽ hiển thị các lệnh tôi đã sử dụng để tìm hiểu:

Để làm cho các ví dụ gọn gàng hơn, chúng tôi sử dụng một biến cho URL:

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

Chúng tôi muốn đo thời lượng của các lệnh; Sử dụng lệnh timecần chú ý không trộn lẫn lệnh và shell dựng sẵn. Chúng tôi sử dụng một chức năng nhỏ để làm cho các dòng ngắn hơn:

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

Lệnh của bạn ghi ra URL của tệp video (bị cắt thành 80 cột):

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

Hãy đo thời gian chạy trên máy tính của tôi:

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

Ok, một giây rưỡi. Nhanh hơn trong câu hỏi, nhưng không nhanh hơn nhiều. Nhưng làm thế nào là nó dành thời gian? Có lẽ nó tải xuống video theo một cách ẩn và loại bỏ nó? Video là 11 phút trong 360p. Chỉ cần tải xuống mà không có tùy chọn nào mất khoảng 13 giây - lâu hơn mười lần.
Cần xem xét kỹ hơn, với tùy chọn dài dòng -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

Ồ, có một số độ trễ trước khi dòng '[gỡ lỗi]' được in. Có vẻ như youtube-dldành một chút thời gian cho thiết lập cấu hình của riêng nó. Đó là một phần tư giây hoặc lâu hơn, không phải là sự chậm trễ mà chúng tôi đang tìm kiếm. Nhưng những gì chúng ta có thể học được từ nó là việc youtube-dlthực hiện có thể chậm.
Sau các tin nhắn, không có gì xảy ra cho đến khi URL kết quả được in. Vì vậy, chúng tôi vẫn không thấy phần thú vị.
Tùy chọn -glà "mô phỏng" tải xuống video theo nghĩa là phần phức tạp của việc tìm ra URL bán bí mật đó, in ra, nhưng cuối cùng lại bỏ qua phần tải xuống thực tế. Có một tùy chọn tương tự -skhông xuất URL và có vẻ tương tự khác. Chúng ta hãy giả sử nó đủ tương tự nếu mất khoảng thời gian đó; Chúng ta cần kiểm tra điều đó.

$ 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, -smất cùng thời gian với -g, vì vậy bạn có thể thay thế chúng để thử nghiệm.
Thú vị hơn là chúng tôi có đầu ra nhiều hơn bây giờ. Và nó được in với một thời gian thú vị: Các dòng được in với độ trễ tương tự nhau, vì vậy có vẻ như chúng là về các hành động thực sự dành thời gian chúng ta tìm kiếm.
Từ các tin nhắn, ít nhất hai trang web được tải xuống. Nhưng chúng ta có thể giả sử rằng từ "trang" sẽ không có nghĩa là một yêu cầu HTTP và một tài liệu HTML duy nhất.

Chúng ta đã học được gì?

Điểm chính là, công việc của chương trình thực sự tốn thời gian, nó không chờ đợi một cái gì đó, hoặc treo.
Ngoài ra, chúng tôi thấy nhiều bước mất thời gian tương tự. Không có gì nhiều để tính toán, vì vậy, đó là cách làm tròn mạng theo một cách nào đó, cộng lại.
Điều đó có nghĩa là, độ trễ của kết nối của chúng tôi chỉ quan trọng ở đây. Thông lượng của kết nối chỉ là không liên quan.

Nếu bạn sẽ làm cho kết nối internet của mình nhanh hơn để nó có thể truyền dữ liệu với tốc độ gấp đôi - điều đó chẳng giúp ích gì cả. Nhưng nếu bạn có thể có được pingthời gian tốt hơn , điều đó sẽ làm cho nó nhanh hơn nhiều.
Tuy nhiên, đó không phải là về 'ping' cho nhà cung cấp dịch vụ internet của bạn; Thời gian ping tất cả các cách để YouTube là điều quan trọng - và có thể không thể thay đổi.

Thật thú vị, đối với bước tiếp theo, tải xuống video, các yêu cầu cho một đường truyền nhanh hoàn toàn ngược lại: độ trễ hoàn toàn không liên quan và thông lượng thực sự có vấn đề.


Chưa mệt à?

Bạn vẫn muốn biết thêm chi tiết để hiểu thời gian thực sự dành cho cái gì?
Bước tiếp theo sẽ là theo dõi kết nối HTTP; Tôi nghi ngờ rằng nó có thể hiển thị nhiều vòng tròn hơn hai, ví dụ như chuyển hướng. Bạn có thể sử dụng wiresharkhoặc proxy HTTP đăng nhập hoặc stracechỉ đếm các cuộc gọi hệ thống để kết nối hoặc viết.

Cho đến hôm nay, cả hai chúng tôi đã nhìn đủ sâu vào lỗ thỏ của mạng.


Vì vậy, những gì có thể là lý do cho thời gian dài như vậy? Có phải do ti kết nối mạng chậm?
bharath kumar reddy bojja

Phụ thuộc vào mức độ chậm của nó - câu hỏi là gì? Đợi một chút để biết chi tiết về các ví dụ của tôi, tôi đang viết chúng.
Volker Siegel

Câu hỏi của tôi là: Sự chậm trễ là do kết nối mạng chậm?
bharath kumar reddy bojja

Vâng, một phần. Câu hỏi ít đơn giản hơn âm thanh;) Nó không phải là về thông lượng của kết nối. Độ trễ là quan trọng ở đây. Từ những gì tôi có thể nói, có ít nhất ba vòng tròn HTTP - nhưng có thể nhiều hơn nữa. Tất cả các độ trễ được nhân với số này, cộng lại. Tôi không biết gì về kết nối của bạn; Nó có thể chậm ở cuối YouTube, khó có thể nói mà không đo. Hãy thử một số thứ khác trên mạng mà bạn biết chúng nhanh như thế nào và kiểm tra xem nó cảm thấy chậm hơn hay bình thường.
Volker Siegel

Vì vậy, tôi đã thêm một số chi tiết :)
Volker Siegel

6

Chỉ cần làm một:

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

Nguồn


1

Có thể có một lý do khác. youtube-dlđược phân phối dưới dạng một ứng dụng Python được nén. Mỗi khi bạn chạy nó, nó trích xuất nó và sau đó chạy nó.

Bạn có thể tự giải nén nó bằng unziplệnh. Sau đó chạy __main__.pynhư bạn sẽ chạy youtube-dl. Trên một máy tính có công suất thấp, như Pi, điều đó sẽ làm tăng đáng kể hiệu suất của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.