当我尝试获取通道的IAudioClient时程序崩溃

时间:2017-07-21 18:03:28

标签: c# discord discord.net

我正在使用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()

2 个答案:

答案 0 :(得分:1)

如果你的命令超时,那是因为'async'不是完全异步的。您需要将命令的RunMode设置为Async

[Command("name",RunMode = RunMode.Async)]

答案 1 :(得分:0)

方法await channel.ConnectAsync()可能需要一些时间,直到它返回一个值,所以我只是注意到我可以在括号内编写另一个方法,而其他方法可以获得所需的IAudioClientaudioClient = 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();        
    }