Чего вам не хватает, так это самого аудиопотока, я приведу пример использования ffmpeg
, потому что это то, что я использовал, и оно работает.
Полное раскрытие, проект, который я собираюсь дать, является моим собственным.
Правильно, значит, у вас уже есть голосовой канал, подключите / отключите все, хорошая работа!
Теперь все, что вам не хватает - это потоковое аудио (из локального файла, как показывает ваш вопрос).
Что вам нужно сделать, это запустить отдельный процесс для ffmpeg
, используя что-то вроде этого:
private Process CreateStream(string filePath)
{
return Process.Start(new ProcessStartInfo
{
FileName = "ffmpeg.exe",
Arguments = $"-hide_banner -loglevel panic -i \"{filePath}\" -ac 2 -f s16le -ar 48000 pipe:1",
UseShellExecute = false,
RedirectStandardOutput = true
});
}
Примечание: ffmpeg.exe
должен находиться в корневом каталоге вашего проекта, в противном случае просто укажите другой путь в параметре FileName = ""
.
Редактировать: Вам также необходимо указать его для копирования в вашу выходную папку после создания проекта. Добавление этих строк в файл .csproj
должно помочь:
<ItemGroup>
<None Update="ffmpeg.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
Чтобы отправить аудио на голосовой канал, к которому вы подключены, используйте что-то вроде этого:
using (Stream output = CreateStream(filePath).StandardOutput.BaseStream)
using (AudioOutStream stream = client.CreatePCMStream(AudioApplication.Music))
{
try
{
await output.CopyToAsync(stream);
}
catch (Exception e)
{
_logger.LogError(e, "Stopped audio stream");
}
}
Где client.CreatePCMStream(AudioApplication.Music)
- это IAudioClient
, к которому подключен ваш бот.
В идеале вы должны иметь некоторый тип AudioService
класса, чтобы делать все это вместо модуля, отвечающего за выполнение команд.
Вот пример модуля с выделенным сервисом, откуда был скопирован приведенный выше код:
Модуль &
Услуги
Надеюсь, это поможет вам.