Python,Youtube-video-downloader-merger 我可以改进这个脚本运行得更快吗?

rob*_*aga 0 python youtube ffmpeg

我创建了一个从 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()
Run Code Online (Sandbox Code Playgroud)

OKE更新:现在代码看起来像这样..第二个问题是从YouTube服务器下载mp4文件很慢,我有10Gb/s的互联网。与 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()
Run Code Online (Sandbox Code Playgroud)

Mah*_*hat 5

首先,您下载不同编码的视频文件和音频文件

\n\n

在你的情况下它是 mp4 和 webm

\n\n

例如,您应该下载 mp4 视频和 m4a 音频

\n\n

或者一个 webm 视频和一个 webm 音频

\n\n

那么说到ffmpeg,应该传递一个参数\xe2\x80\x9c -c copy\xe2\x80\x9d

\n\n

ffmpeg 命令行示例:

\n\n
ffmpeg -i myvideo.mp4 -i myaudio.m4a -c copy output.mp4\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 github 上使用相同技术的 python 项目的链接

\n\n

https://github.com/pyIDM/pyIDM

\n\n

检查video.py文件

\n\n

进一步解释:

\n\n

当您使用 \xe2\x80\x9c -c copy\xe2\x80\x9d 参数时,ffmpeg 将仅复制音轨并将其与视频合并,前提是音频和视频具有相同的编解码器容器,此过程不到 2 秒

\n\n

否则,它将处理视频中的每一帧和音频中的每一位,然后将它们转换为所需的格式,这需要很长时间

\n