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)
首先,您下载不同编码的视频文件和音频文件
\n\n在你的情况下它是 mp4 和 webm
\n\n例如,您应该下载 mp4 视频和 m4a 音频
\n\n或者一个 webm 视频和一个 webm 音频
\n\n那么说到ffmpeg,应该传递一个参数\xe2\x80\x9c -c copy\xe2\x80\x9d
\n\nffmpeg 命令行示例:
\n\nffmpeg -i myvideo.mp4 -i myaudio.m4a -c copy output.mp4\n
Run Code Online (Sandbox Code Playgroud)\n\n这是 github 上使用相同技术的 python 项目的链接
\n\nhttps://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 归档时间: |
|
查看次数: |
1698 次 |
最近记录: |