gpt4 book ai didi

python - 我如何在不事先下载和转换的情况下将音频从 pytube 流式传输到 FFMPEG 和 discord.py

转载 作者:行者123 更新时间:2023-12-05 04:59:06 26 4
gpt4 key购买 nike

我在我的一个小型服务器上安装了一个 discord.py 机器人。我已经设置了一个音乐命令,可以从 YouTube 下载歌曲并将其输出到 VC 中。目前,该命令下载整首歌曲,对其进行转换,然后然后将其输出到 VC 中,但这个过程非常缓慢。我将如何将音频直接流式传输到 VC 中?我愿意使用 youtube_dl 代替 pytube3。我不太关心较小的代码优化,因为这只是我和几个 friend 的小型机器人。

感谢任何输入!

@bot.command()
async def play(ctx, *song):
if ctx.author.voice is None or ctx.author.voice.channel is None:
await ctx.send("You aren't in a VC!")
return
print(song) #debugging
os.system("rm music.mp3")
ydl_opts = {
'noplaylist': True,
'outtmpl': 'music',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '128',
}],
'format': '139',
}
youtube = pytube.YouTube(str(song).strip("(,)'"))
video = youtube.streams.filter(only_audio=True).first()
await ctx.send("downloading")
video.download(filename="music")
await ctx.send("converting...")
os.system("ffmpeg -i music.mp4 -map 0:a:0 -b:a 96k music.mp3")

voice_channel = ctx.author.voice.channel
vc = await voice_channel.connect()
vc.play(discord.FFmpegPCMAudio('music.mp3'), after=lambda e: print('done', e))
while vc.is_playing():
await asyncio.sleep(1)
await ctx.voice_client.disconnect()

最佳答案

您已经在使用 youtube_dl(根据您的 ydl_opts 变量判断)。你可以做的是:

  • 如果您没有安装 youtube_dl(pip install youtube-dl)。
  • 安装请求(pip 安装请求)
  • 提取视频信息:
    from youtube_dl import YoutubeDL
    from requests import get

    #Get videos from links or from youtube search
    def search(query):
    with YoutubeDL({'format': 'bestaudio', 'noplaylist':'True'}) as ydl:
    try: requests.get(arg)
    except: info = ydl.extract_info(f"ytsearch:{arg}", download=False)['entries'][0]
    else: info = ydl.extract_info(arg, download=False)
    return (info, info['formats'][0]['url'])
  • 让机器人加入 channel :
    async def join(ctx, voice):
    channel = ctx.author.voice.channel

    if voice and voice.is_connected():
    await voice.move_to(channel)
    else:
    voice = await channel.connect()
  • 播放视频:
    from discord import FFmpegPCMAudio
    from discord.ext import commands
    from discord.utils import get


    @bot.command()
    async def play(ctx, *, query):
    #Solves a problem I'll explain later
    FFMPEG_OPTS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}

    video, source = search(query)
    voice = get(bot.voice_clients, guild=ctx.guild)

    await join(ctx, voice)
    await ctx.send(f'Now playing {info['title']}.')

    voice.play(FFmpegPCMAudio(source, **FFMPEG_OPTS), after=lambda e: print('done', e))
    voice.is_playing()
  • 要知道 video 变量包含什么,您可以打印它。
  • 但是,流式音频会导致一个已知问题,explained here .要解决这个问题,您必须使用那个 FFMPEG_OPTS 变量。它会将机器人重新连接到源,因此它仍然能够流式传输视频,发生这种情况时,您的终端中会收到一条您无需担心的奇怪消息。
  • 请注意,没有错误管理,您必须自己做。

关于python - 我如何在不事先下载和转换的情况下将音频从 pytube 流式传输到 FFMPEG 和 discord.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63647546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com