Discus.Net Api를 사용하여 봇을 discord 서버에 연결하고 봇을 만들어 음악과 오디오를 재생하려고합니다.
봇을 채널에 참여시킬 수 있으며 훌륭하게 작동하지만
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 Gateway Connecting 21:39:20 Gateway Connected 21:39:20 Gateway Ready Channel: תודה תודה תודה תודה תודה - 334069917047455747 21:39:29 Gateway A MessageReceived handler is blocking the gateway task. at Discord.WebSocket.SocketGuild.d__160.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Discord.WebSocket.SocketGuild.d__160.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Discord.WebSocket.SocketVoiceChannel.d__14.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at ruin_counter.Program.d__9.MoveNext()
- 답변 # 1
- 답변 # 2
방법
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(); }
관련 자료
- c++ - nullptr에 도달하면 프로그램이 충돌합니다이진 검색 트리
- c# - 버튼을 사용하여 블루투스를 끄도록 코드를 추가하면 프로그램이 충돌합니다
- c - scanf 라인 중 프로그램 충돌
- c++ - "libc ++ abidylib 파일을 열 수 없습니다" 프로그램이 빌드되지만 실행되면 충돌합니다 xcode 101 (10B61) 사용
- android - 프로그램이 코드 행을 실행할 때 문제가있는 데이터 배열이 Java에서 앱 충돌
- c# - 버튼 클릭시 다른 컴퓨터에 exe 파일을 넣은 후 프로그램 충돌
- 내 C 프로그램이 두 번째 루프에서 충돌하고 이유를 모르겠습니다
- c++ - SS_OWNERDRAW를 사용하여 CStatic을 동적으로 만들면 UpdateWindow에서 프로그램이 충돌 함
- c++ - 배열 요소에 값을 할당 한 후 프로그램 충돌
- Fortran 루틴을 호출하는 C MPI 프로그램이 충돌 함
- android - 코드가있는 tabItem 중 하나를 삭제할 때 tabItem을 변경할 수 없습니다 (프로그램 충돌)
- compilation - 코드가 exe에 링크되면 C ++ 프로그램이 충돌하지만 코드가 exe로 컴파일되면 정상적으로 작동합니다
- try catch - java - 두 개의 잘못된 값을 입력 한 후 프로그램 충돌
명령이 시간 초과되면 '비동기'가 정확히 비동기 적이 지 않기 때문입니다. 명령의 RunMode를 비동기로 설정해야합니다
[Command("name",RunMode = RunMode.Async)]