使用pytube下载mp3格式的视频

23

我一直在使用pytube来在Python中下载YouTube视频。到目前为止,我已经能够以mp4格式下载。

yt = pytube.YouTube("https://www.youtube.com/watch?v=WH7xsW5Os10")

vids= yt.streams.all()
for i in range(len(vids)):
    print(i,'. ',vids[i])

vnum = int(input("Enter vid num: "))
vids[vnum].download(r"C:\YTDownloads")
print('done')

我成功下载了"音频"版本,但它是以.mp4 格式呈现的。 我试图将扩展名改为.mp3,并播放了音频,但应用程序(Windows Media Player)停止响应并开始延迟。

请问如何直接下载视频作为.mp3格式的音频文件?由于我是第一次使用此模块,请提供一些代码。

16个回答

19

如何直接将视频文件下载为.mp3格式的音频文件?

恐怕不行。可以直接下载的文件仅限于列在yt.streams.all()下的文件。

但是,将已下载的音频文件从.mp4转换为.mp3格式非常简单。例如,如果您已安装ffmpeg,则在终端中运行此命令即可实现(假设您位于下载目录):

$ ffmpeg -i downloaded_filename.mp4 new_filename.mp3

或者,您可以使用Python的subprocess模块以编程方式执行ffmpeg命令:

import os
import subprocess

import pytube

yt = pytube.YouTube("https://www.youtube.com/watch?v=WH7xsW5Os10")

vids= yt.streams.all()
for i in range(len(vids)):
    print(i,'. ',vids[i])

vnum = int(input("Enter vid num: "))

parent_dir = r"C:\YTDownloads"
vids[vnum].download(parent_dir)

new_filename = input("Enter filename (including extension): "))  # e.g. new_filename.mp3

default_filename = vids[vnum].default_filename  # get default name using pytube API
subprocess.run([
    'ffmpeg',
    '-i', os.path.join(parent_dir, default_filename),
    os.path.join(parent_dir, new_filename)
])

print('done')

编辑:删除了有关subprocess.call的提及。使用subprocess.run(除非您使用的是Python 3.4或更低版本)


2
能否将pytube的音频导入到ffmpeg中,以便下载和转换可以同时进行? - ritiek
1
对我来说,它们两个都很慢(转换最慢)。不管怎样,我找到了解决方法。您需要分块下载内容,同时立即将每个已下载的块传递给FFmpeg进行处理。我在https://gist.github.com/ritiek/c98452d8dcf062a63a70fe4631099419上发布了一个示例要点。鉴于我的硬件规格和互联网速度,我注意到整体所需时间显着减少(好事)。 - ritiek
非常好的要点!您能否提供一些时间结果,比较串行方法和您的分块方法?我很想看看差异是什么... - scrpy
@CrazyVideoGamez 你试过了吗?有效果吗?据我所知,它不会起作用,请参见我在下面此答案的评论。 - scrpy
@scrpy 我已经尝试过了,浏览器正确地显示为音频文件。 - CrazyVideoGamer
显示剩余3条评论

8
我假设您正在使用Python 3和pytube 9.x,您可以使用filter方法来“筛选”您感兴趣的文件扩展名。
例如,如果您想下载mp4视频文件格式,代码如下:
pytube.YouTube("url here").streams.filter(file_extension="mp4").first()

如果您想要提取音频,可以按照以下方式操作:
pytube.YouTube("url here").streams.filter(only_audio=True).all()

希望这能帮助到来到此页面的任何人,而不是进行不必要的转换。

1
这是很好知道的,谢谢@AlgoLamda。然而,我认为OP的问题归结为“如何直接以mp3格式下载mp4格式的音频文件”,对此的答案是:你不能,你必须转换它。这是因为mp3是一种仅限于音频的格式,而mp4是一种“数字多媒体容器”格式,因此一个仅包含音频的mp4文件仍然是在容器中的音频,并不同于mp3。 - scrpy
1
这是YouTube,不是Youtube。 - CrazyVideoGamer
尝试过它,确实下载了,但是无法播放。 - Natan Ytzhaki
跳过转换并不总是一个好主意。我曾经这样做,只是将仅包含音频的mp4重命名为mp3。它在大多数程序上都可以工作,但当我尝试在discord Pydub中播放时出现了问题。由于重命名而不是转换导致的缺失头文件。 - Toma

3

Pytube不支持"mp3"格式,但是你可以下载webm格式的音频。下面的代码演示了如何实现。

    from pytube import YouTube
    yt = YouTube("https://www.youtube.com/watch?v=kn8ZuOCn6r0")
    stream = yt.streams.get_by_itag(251)
< p > itag 是用来获取具有特定分辨率的文件的唯一标识符。 < /p >
    stream.download()

如果你想要得到mp3格式的文件,那么你需要将(mp4或webm)文件格式转换为mp3格式。


3

下载视频并转换为音频,然后将音频扩展名更改为MP3:

from pytube import YouTube
import os

url = str(input("url:- "))
yt = YouTube(url)
video = yt.streams.filter(only_audio=True).first()
downloaded_file = video.download()
base, ext = os.path.splitext(downloaded_file)
new_file = base + '.mp3'
os.rename(downloaded_file, new_file)
print("Done")

3

您需要安装最新版本的pytubemp3(使用pip install pytubemp3),版本为0.3+

from pytubemp3 import YouTube 
YouTube(video_url).streams.filter(only_audio=True).first().download()

这将下载音频文件,但是带有.mp4扩展名,他想要mp3扩展名的文件。 - Colton Walker

2
使用此代码,您将下载播放列表中的所有视频,并将它们以YouTube标题的mp4和mp4音频格式保存。
我在这个问题中使用了@scrpy的代码,并从@Jean-Pierre Schnyder的答案中获得了提示。
import os
import subprocess
import re
from pytube import YouTube
from pytube import Playlist


path =r'DESTINATION_FOLER'
playlist_url = 'PLAYLIST_URL'

play = Playlist(playlist_url)

play._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
print(len(play.video_urls))
for url in play.video_urls:
    yt = YouTube(url)
    audio = yt.streams.get_audio_only()
    audio.download(path)
    nome = yt.title
    new_filename=nome+'.mp3'
    default_filename =nome+'.mp4'
    ffmpeg = ('ffmpeg -i ' % path default_filename + new_filename)
    subprocess.run(ffmpeg, shell=True)
         
    
print('Download Complete')

1

Pytube不支持"mp3"格式,但您可以以webm格式下载音频。以下代码演示了这一点。

    from pytube import YouTube
    yt = YouTube("https://www.youtube.com/watch?v=kn8ZuOCn6r0")
    stream = yt.streams.get_by_itag(251)
    stream.download()

对于mp3格式,您需要将(mp4或webm)文件格式转换为mp3。


1
这是我的解决方案:
import os
import sys
from pytube import YouTube
from pytube.cli import on_progress

PATH_SAVE = "D:\Downloads"

yt = YouTube("YOUR_URL", on_progress_callback=on_progress)
#Download mp3
audio_file = yt.streams.filter(only_audio=True).first().download(PATH_SAVE)
base, ext = os.path.splitext(audio_file)
new_file = base + '.mp3'
os.rename(audio_file, new_file)

#Download Video
ys = yt.streams.filter(res="1080p").first()
ys.download(PATH_SAVE)

工作中:Python v3.9.x 和 pytube v11.0.1


1
from pytube import YouTube

yt = YouTube(url)

yt.streams.get_audio_only().download(output_path='/home/',filename=yt.title)

5
Please, add explaination. - Syscall

1
这里是一个更加简洁紧凑的方式来下载mp4视频并将其转换为mp3格式:
下载会将文件下载到当前目录或程序位置,并将文件转换为mp3作为新文件。
from pytube import YouTube
import os
import subprocess
import time

while True:
    url = input("URL: ")

    # Title and Time
    print("...")
    print(((YouTube(url)).title), "//", (int(var1)/60),"mins")
    print("...")

    # Filename specification
    # Prevents any errors during conversion due to illegal characters in name
    _filename = input("Filename: ")

    # Downloading
    print("Downloading....")
    YouTube(url).streams.first().download(filename=_filename)
    time.sleep(1)

    # Converting
    mp4 = "'%s'.mp4" % _filename
    mp3 = "'%s'.mp3" % _filename
    ffmpeg = ('ffmpeg -i %s ' % mp4 + mp3)
    subprocess.call(ffmpeg, shell=True)

    # Completion
    print("\nCOMPLETE\n")

这是一个无限循环,允许重命名、下载和转换多个URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接