Получение URL-адреса видео YouTube с помощью `youtube-dl` происходит медленно, без загрузки видео

Я хочу получить URL-адрес с помощью youtube-dl и опции «simulate» -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-кода, который необходим;
Команде необходимо сделать как минимум два HTTP-запроса один за другим и, возможно, больше.

Поэтому, если что-то медленное, оно умножается на количество запросов.

Для меня это занимает 1,5 секунды на очень быстрой линии – это не так далеко от 8 секунд.

Как узнать

Я покажу команды, которые я использовал, чтобы выяснить:

Чтобы сделать примеры более аккуратными, мы используем переменную для URL:

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

Мы хотим измерить продолжительность команд; Использование времени команды должно быть осторожным, чтобы не смешивать команду и встроенную оболочку. Мы используем небольшую функцию, чтобы сделать линии короче:

 $ 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 

Хорошо, полторы секунды. Быстрее, чем в вопросе, но не намного быстрее. Но как это тратит время? Может быть, он каким-то образом скрывает видео и отбрасывает его? Видеоролик – 11 минут в 360p. Просто скачать его без опций занимает около 13 секунд – в десять раз дольше.
Необходимо поближе познакомиться с подробным вариантом -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-адреса, печатает его, но затем пропускает фактическую загрузку в конце. Существует аналогичный вариант, который не выводит 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-документ.

Что мы узнали?

Главное, работа программы действительно требует времени, она не ждет чего-то или висит.
Кроме того, мы видим, что несколько этапов занимают одинаковое количество времени. Существует не так много, чтобы рассчитать, так что это сетевые кругообороты в какой-то мере, сложение.
Это означает, что латентность нашей связи важна только здесь. Пропускная способность соединения просто не имеет значения.

Если вы сделаете свое интернет-соединение быстрее, чтобы он мог передавать данные с двойной скоростью – это не помогло бы вообще. Но если вы сможете улучшить время ping , это сделает его намного быстрее.
Тем не менее, речь идет не о «пинговых» временах для вашего интернет-провайдера; Время пинга на YouTube – это то, что важно, и может быть невозможно изменить.

Интересно отметить, что для следующего шага, загружая видео, требования к быстрой линии в точности противоположны: латентность не имеет отношения к действительности, и пропускная способность действительно имеет значение.

Еще не устали?

Хотите еще больше деталей, чтобы понять, на что тратится время?
Следующим шагом будет отслеживание HTTP-соединения; Я бы заподозрил, что он может отображать еще много обращений, чем два, например, для перенаправления. Вы можете использовать wireshark или протоколирующий HTTP-прокси или strace чтобы просто подсчитать системные вызовы для подключения или записи.

На сегодняшний день мы оба достаточно глубоко заглянули в кроличью нору сетей.

Просто выполните:

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

Источник

Это может быть другая причина. youtube-dl распространяется как зашифрованное приложение Python. Каждый раз, когда вы запускаете его, он извлекает его, а затем запускает.

Вы можете вручную извлечь его с помощью команды unzip . Затем запустите __main__.py поскольку вы запустите youtube-dl . На компьютере с низким энергопотреблением, таком как Pi, это заметно повысит вашу производительность.