有没有办法在 python 3.7 中使用 youtube-dl 或 pafy 库直接从 youtube 视频流音频?

Yas*_*ani 5 audio buffer stream youtube-dl pafy

我不想一次又一次地从 YouTube 视频下载音频,而是想流式传输音频并直接访问缓冲区中的原始音频字节。换句话说,我想将原始音频字节存储在 RAM 中,并在我的 python 脚本中使用它们,而不需要在系统上完全下载和保存音频文件,以减少内存写入周期。youtube-dl 库或 pafy 库中是否有任何解决方法可以执行相同的操作?

小智 3

是的,有,我刚刚知道它是如何工作的。在重写中,您可以使用discord.FFmpegPCMAudio(url)来做到这一点。您必须记住,您输入discord.FFmpegPCMAudio() 的网址不是可以从浏览器复制的YouTube 链接,例如https://www.youtube.com/watch?v=videoid。从以下代码中,您将获得一个巨大的 json 字典,其中包含“真实”url:

# Get a json library with general video information, as well as the url we need to stream the audio.

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
     song_info = ydl.extract_info("https://www.youtube.com/watch?v=INPUTYTLINKHERE", download=False)
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以打印出 Song_info 以查看有关视频的更多信息,例如观看量、点赞量等:

print(song_info)
Run Code Online (Sandbox Code Playgroud)

这是最终的代码:(我使用 @client 和 async def on_message(message))

# The "real" url is in song_info["formats"][0]["url].

message.guild.voice_client.play(discord.FFmpegPCMAudio(song_info["formats"][0]["url"]))
message.guild.voice_client.source = discord.PCMVolumeTransformer(message.guild.voice_client.source)
message.guild.voice_client.source.volume = 1
Run Code Online (Sandbox Code Playgroud)

我希望这已经说清楚了。