Python, Youtube-video-downloader-merger Могу ли я установить этот скрипт быстрее? - PullRequest
0 голосов
/ 30 января 2020

Я создал скрипт, который загружает видео и звук с Youtube, и после этого объединяет звук и видео с ffmpeg, мне интересно, есть ли другой способ добиться того же результата, но более быстрым способом? Поскольку этот сценарий занимает около 7 минут, это зависит от качества и продолжительности видео. Мой код ниже:

from pytube import YouTube
import sys
import ffmpeg
import os


class Downloader(YouTube):

    def __init__(self, link):
        self.link = YouTube(link)
        self.hq = []
        self.best_video = []
        self.best_sound = []


    def stream_objects(self):
        q = [self.hq.append(x) for x in self.link.streams.all()]
        self.best_video.append(str(self.hq[1]).split()[1].split('\"')[1])
        self.best_sound.append(str(self.hq[-1]).split()[1].split('\"')[1])
        return self.best_video, self.best_sound

    def downloady(self):
        vid = self.link.streams.get_by_itag(str(self.best_video).strip("['']"))
        audio = self.link.streams.get_by_itag(str(self.best_sound).strip("['']"))
        self.vid_title = (f"{vid.title}"+".mp4")

        vid.download(filename='video')
        audio.download(filename='audio')
        print('Downloaded, Now Starting Merge \n\n\n\n\n')
        print(f'{self.vid_title}'+'\n')

    def merge(self):
        ffmpeg.output(ffmpeg.input('video.mp4'), ffmpeg.input('audio.webm'), self.vid_title).run()
        os.remove('video.mp4')
        os.remove('audio.webm')



if __name__=='__main__':
    a = Downloader(link = sys.argv[1])
    a.stream_objects()
    a.downloady()
    a.merge()

ОКЕ ОБНОВЛЕНИЕ: Теперь код выглядит следующим образом ... Вторая проблема - медленная загрузка файлов mp4 с сервера YouTube, у меня 10 Гбит / с inte rnet. Хорошая связь с серверами YT, но почему такая плохая загрузка? ? ? :)

from pytube import YouTube
import sys
import ffmpeg
import os 
import subprocess

class Downloader(YouTube):

    def __init__(self, link):
        self.link = YouTube(link)
        self.hq = []


    def stream_objects(self):
        self.best = self.link.streams.filter(file_extension='mp4')
        q = [self.hq.append(x) for x in self.best.all()]
        self.best_vid_itag = str(self.best.all()[1]).split()[1].split('\"')[1]
        self.best_audio_itag = str(self.best.all()[-1]).split()[1].split('\"')[1]

    def downloader(self):
        vid = self.link.streams.get_by_itag(self.best_vid_itag)
        aud = self.link.streams.get_by_itag(self.best_audio_itag)
        print('Donwloading Video file...\n')
        vid.download(filename='video')
        print('Video file downloaded... Now Trying download Audio file..\n')
        aud.download(filename='audio')
        print('Audio file downloaded... Now Trying to merge audio and video files...\n')

    def merger(self):
        lin = str(self.link.title).rstrip()
        lin2 = (lin+'.mp4')
        subprocess.run(f'ffmpeg -i video.mp4 -i audio.mp4 -c copy "{lin2}"', shell=True)
        os.remove('video.mp4')
        os.remove('audio.mp4')
        print('Done....\n')

if __name__=='__main__':
    a = Downloader(link = sys.argv[1])
    a.stream_objects()
    a.downloader()
    a.merger()

1 Ответ

3 голосов
/ 30 января 2020

Прежде всего, вы скачиваете видеофайл и аудиофайл с другой кодировкой

В вашем случае это mp4 и webm

Вы должны, например, загрузить видео mp4 и аудио m4a

Или веб-видео и веб-аудио

Затем для ffmpeg вы должны передать параметр «- c copy»

Пример строки команды ffmpeg:

ffmpeg -i myvideo.mp4 -i myaudio.m4a -c copy output.mp4

Вот ссылка на python проект на github, использующий ту же технику

https://github.com/pyIDM/pyIDM

Проверьте файл video.py

Дальнейшее объяснение:

Когда вы используете параметр «- c copy», ffmpeg просто скопирует звуковую дорожку и объединит ее с видео при условии, что и аудио, и видео имеют одинаковый код c контейнер этот процесс занимает менее 2 секунд

В противном случае он будет обрабатывать каждый кадр в видео и каждый бит в аудио, а затем преобразовывать их в нужный формат, что занимает очень много времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...