如何使用 discord.py 在音乐机器人上获得最佳音频质量?
Posted
技术标签:
【中文标题】如何使用 discord.py 在音乐机器人上获得最佳音频质量?【英文标题】:How to get best audio quality on music bot using discord.py? 【发布时间】:2021-05-20 06:39:18 【问题描述】:我在 discord.py 中构建了一个不和谐音乐机器人,但由于某种原因,它播放的音乐质量不如 Fredboat 或 Rythm(所以我认为语音聊天的比特率不是问题)。我在网上尝试了几件事。
唯一能稍微提高质量的就是在播放之前下载歌曲。但质量仍远不如 Fredboat 的。这也是非常不切实际的,因为下载一首 1 小时的歌曲需要一段时间,而且很耗空间。
我对如何解决这个问题以及为什么会发生这种情况的解释很感兴趣。
这是我们目前用于音乐机器人的代码:
from discord import FFmpegPCMAudio
import discord
from apscheduler.schedulers.asyncio import Asyncioscheduler
from apscheduler.triggers.cron import CronTrigger
from discord.ext import commands, tasks
from youtubesearchpython import VideosSearch
class cmd_music(commands.Cog, name="music_commands"):
def __init__(self, bot):
self.bot = bot
self.music_queue = []
self.scheduler = AsyncIOScheduler()
self.scheduler.add_job(self.check_queue, CronTrigger(second="0,5,10,15,20,25,30,35,40,45,50,55"))
self.scheduler.start()
async def play_raw(self, voice_client):
if not self.music_queue:
return
YDL_OPTIONS = 'format': 'bestaudio', 'noplaylist':'True'
FFMPEG_OPTIONS = 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'
if not voice_client.is_playing():
with YoutubeDL(YDL_OPTIONS) as ydl:
info = ydl.extract_info(self.music_queue.pop(0), download=False)
URL = info['formats'][0]['url']
voice_client.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS))
voice_client.is_playing()
async def check_queue(self):
if not self.bot.voice_clients: return
client = self.bot.voice_clients[0]
if not client.is_playing():
if self.music_queue:
await self.play_raw(client)
@commands.command(brief="join")
async def join(self, ctx):
await ctx.author.voice.channel.connect()
@commands.command(brief="leave")
async def leave(self, ctx):
await ctx.voice_client.disconnect()
self.music_queue = []
@commands.command(brief="play")
async def play(self, ctx, *name):
url = VideosSearch(" ".join(name[:]), 1).result().get("result")[0].get("link")
self.music_queue.append(url)
await ctx.send("Now playing: " + url)
@commands.command(brief="skip")
async def skip(self, ctx):
await ctx.send("Skipped current song")
ctx.voice_client.stop()
if self.music_queue:
await self.play_raw(ctx.voice_client)```
【问题讨论】:
【参考方案1】:我也陷入了这个质量问题。但我找到了解决这个问题的方法。
你也可以测试一下,我得到了和流媒体一样的质量,没有问题。
FFMPEG_OPTIONS = 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'
YDL_OPTIONS = 'format': 'bestaudio/best', 'noplaylist':'True'
voice = get(client.voice_clients, guild=ctx.guild)
with YoutubeDL(YDL_OPTIONS) as ydl:
info = ydl.extract_info(url, download=False)
I_URL = info['formats'][0]['url']
source = await discord.FFmpegOpusAudio.from_probe(I_URL, **FFMPEG_OPTIONS)
voice.play(source)
voice.is_playing()
【讨论】:
【参考方案2】:以防万一有人遇到这种情况。我的问题似乎是 ffmpeg 的音频流质量低。 Lavalink 似乎提供了更好的质量。
我建议查看这个 youtube 视频播放列表,您可以在其中了解使用 discord.py 和 Lavalink 创建高质量音乐机器人的每一步: https://www.youtube.com/watch?v=tZPrkKT9QHc&list=PLYeOw6sTSy6ZIfraPiUsJWuxjqoL47U3u&index=1&ab_channel=CarberraTutorials
【讨论】:
以上是关于如何使用 discord.py 在音乐机器人上获得最佳音频质量?的主要内容,如果未能解决你的问题,请参考以下文章
Discord 音乐机器人 - 队列 (discord.py)
通过在 top.gg / discordbotlist 上投票获得机器人奖励 (discord.py)
Discord Py - Heroku 托管 Bot 上的音乐命令