Как воспроизводить музыку из локального файла - PullRequest
0 голосов
/ 27 августа 2018

После долгого пробного периода мне удалось подключить своего бота к голосовому каналу и отключиться от него. Однако я не мог найти правильный способ играть музыку. Я исследовал и пытался читать, и наткнулся на множество различных опций, таких как ffmpeg, sharplink и lavalink, но я не знаю, как их использовать.

Есть точный вопрос о SO Как воспроизвести аудиофайл на канал? , но он говорит с использованием JavaScript, а не .NET, поэтому я нигде.

Итак, как воспроизвести аудио (локальный файл) с моего бота в голосовом канале после его успешного подключения. Версия: Discord.Net 2.x по ночам

1 Ответ

0 голосов
/ 28 августа 2018

Чего вам не хватает, так это самого аудиопотока, я приведу пример использования 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 класса, чтобы делать все это вместо модуля, отвечающего за выполнение команд.

Вот пример модуля с выделенным сервисом, откуда был скопирован приведенный выше код:

Модуль & Услуги

Надеюсь, это поможет вам.

...