Как скачать видео из YouTube в Python используя pafy в 4K
Приведу несколько примеров, как можно просто скачать видео из YouTube используя библиотеку pafy. Примеры очень простые, а качать можно как HD видео таки видео в 4K. Документацию по Pafy можно почитать тут.
Качаем видео с YouTube в HD качестве.
1 2 3 4 5 6 |
import pafy def youtubeDownload(url): yVideo = pafy.new(url) video = yVideo.getbest() video.download() |
Таким образом можно скачать видео из YouTube в HD качестве или в максимально высоком доступном качестве! Но тут есть один момент: Метод «getbest()» вернёт нам максимально доступное видео в месте с аудио потоком. Т.е с качается нормальное видео со звуком, в самом лучшем (доступном ) качестве.
Таким способом не получиться скачать видео в 4K или в Full HD. Так как, Full HD и выше YouTube транслирует видео поток от аудио потока отдельно.
Проще говоря. Что бы скачать Full HD или 4K придётся качать видео поток отдельно от аудио потока. После чего нужно объединить видео и аудио в 1 файл! Звучит сложно, но на деле все просто.
Качаем видео с YouTube в Full HD или 4K качестве.
Для начало просто посмотрим все доступные потоки! Сделать это можно следующим образом.
1 2 3 4 5 6 7 |
def youtubeDownload4k(url): yVideo = pafy.new(url) videoStream = yVideo.videostreams # Список потоков только для видео audioStream = yVideo.getbestaudio() for i, videoStreams in enumerate(videoStream): print(f"{str(i)} / {videoStreams}") |
С Аудио потоком вообще не паримся, забираем в самом высоком качестве и все. Смотрим выхлоп и видим:
Видим много вариантов Видео потока. Можно скачать то что нужно, для примера скачаем 4K что уж мелочиться. Для этого дополним функцию.
1 2 3 4 5 6 7 8 9 10 |
def youtubeDownload4k(url): yVideo = pafy.new(url) videoStream = yVideo.videostreams # Список потоков только для видео audioStream = yVideo.getbestaudio() for i, videoStreams in enumerate(videoStream): print(f"{str(i)} / {videoStreams}") videoStream[13].download(filepath=f"video.{videoStream[13].extension}") # Качаем видео поток audioStream.download(filepath=f"audio.{audioStream.extension}") # Качаем аудио поток |
Обратите внимание. Тут используется параметр «filepath» им мы укажем имя файла с которым будет сохранён, как видео так и аудио поток. Это обязательно делать, так как по умолчанию видео поток и аудио поток имеет одинаковое имя. И скорее всего расширение будет так же одинаковое «webm» соответственно разместить в одном каталоге 2 файла с одинаковым именем и расширением не возможно. По этому меняем имя на свои.
После загрузки появится 2 файла
audio.webm
video.webm
Теперь нужно объединить видео и аудио потоки в один файл. Как это сделать? Будем использовать мощную штуку под названием «ffmpeg«! С помощью ffmpeg можно делать с видео что угодно, ну или почти… Я нашел пример объединения видео аудио в один файл, его и покажу. Если вы захотите конвертировать видео в другой формат и.т.д. Читайте документацию по ffmpeg. Дополним функцию ещё парой строк кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def youtubeDownload4k(url): yVideo = pafy.new(url) videoStream = yVideo.videostreams # Список потоков только для видео audioStream = yVideo.getbestaudio() for i, videoStreams in enumerate(videoStream): print(f"{str(i)} / {videoStreams}") videoStream[13].download(filepath=f"video.{videoStream[13].extension}") # Качаем видео поток audioStream.download(filepath=f"audio.{audioStream.extension}") # Качаем аудио поток cmd = f"{os.getcwd()}/ffmpeg/bin/ffmpeg.exe -i video.{videoStream[13].extension} -i audio.{audioStream.extension} -loglevel quiet -stats -c copy output.{videoStream[13].extension}" subprocess.call(cmd, shell=True) |
Вот так легко можно скачать видео из YouTube в 4K. В итоге на выходе получаем файл output.webm в 3840×2160. Теперь на своё усмотрение делаем с ним все что угодно, ну или почти… при помощи библиотеки «ffmpeg«
Помог решить Вашу проблему? Угостить кофе!