我正在使用Discord.Net Api使机器人连接到不和谐服务器,我想要机器人播放音乐和音频。
我可以让僵尸程序加入一个频道并且效果很好,但当我尝试获取频道的IAudioClient
时(来自IAudioClient
我可以获得音频输出流,这样我就可以将音乐写入它就是传输音乐的东西,我得到了一个例外。
这是我加入频道然后获得频道IAudioClient
的代码:
[Command("join")]
public async Task JoinChannel(IVoiceChannel channel = null)
{
channel = channel ?? (callingUser as IGuildUser)?.VoiceChannel;
if(channel == null)
{
await callingMsg.Channel.SendMessageAsync("You must be in a voice channel.");
return;
}
Console.WriteLine("Channel: " + channel.Name + " - " + channel.Id);
try
{
audioClient = await channel.ConnectAsync(); //crashes here
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
我不知道它是否在这里出现了问题,但我只为音频传输安装了“ffmpeg”,但到目前为止,我没有看到任何问题,只有获得音频通道。我使用了本教程:https://discord.foxbot.me/docs/guides/voice/sending-voice.html 但是在本教程的顶部,你可以看到一个标题,说教程已经过时了。
我得到的例外是The operation has timed out
。
21:39:18 Discord Discord.Net v1.0.1(API v6) 21:39:19网关连接 21:39:20 Gateway Connected 21:39:20 Gateway Ready 频道:照片照片和照片 - 334069917047455747 21:39:29网关MessageReceived处理程序正在阻止网关任务。 在Discord.WebSocket.SocketGuild.d__160.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在Discord.WebSocket.SocketGuild.d__160.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Discord.WebSocket.SocketVoiceChannel.d__14.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在ruin_counter.Program.d__9.MoveNext()
答案 0 :(得分:1)
如果你的命令超时,那是因为'async'不是完全异步的。您需要将命令的RunMode设置为Async
[Command("name",RunMode = RunMode.Async)]
答案 1 :(得分:0)
方法await channel.ConnectAsync()
可能需要一些时间,直到它返回一个值,所以我只是注意到我可以在括号内编写另一个方法,而其他方法可以获得所需的IAudioClient
:
audioClient = await channel.ConnectAsync(SendAsync);
private void SendAsync(IAudioClient audioClient)
{
var ffmpeg = CreateStream("tune.mp3");
var output = ffmpeg.StandardOutput.BaseStream;
var discord = audioClient.CreatePCMStream(AudioApplication.Mixed);
output.CopyToAsync(discord);
discord.FlushAsync();
}