Потоковое воспроизведение MP3 на Discord.net 2.0 - звук очень быстрый (бурундук).Идеи? - PullRequest
1 голос
/ 07 мая 2019

Я использую набор примеров, найденных в Интернете, для отправки аудио из файла MP3 на диск-канал через Discord.net 2.0 (c #).

Потребовалось целую вечность, чтобы получить какой-либо звук для отправки ... и теперь, когда я, по крайней мере, заставил это работать, звук суперскоростной - как у бурундуков по скорости.

В качестве фона, пока я использую статический mp3-файл, я на самом деле буду использовать облачный текстовый речевой движок Google для генерации потока, который я буду отправлять, но сначала хотел, чтобы он работал с известным файлом.

Я не новичок в разработке, но я новичок в работе со звуком любого рода. Я понимаю, как работает аудио - и в этом случае проблема должна быть связана с битрейтом, но, похоже, это не так, поскольку я вручную устанавливаю битрейт потока на битрейт файла (и я попытался изменить это безрезультатно).

Кроме того, я в высшей степени озадачен циклом while, который вы увидите в моем коде ниже. Я никогда не использовал подобный цикл while ... хотя он, кажется, работает, хотя я не могу понять, почему, так как переменная в условии, кажется, не меняется. Я чувствую, что упускаю что-то очень простое и просто не могу понять это. Любая помощь с благодарностью!

Я попробовал почти каждый блок кода, связанный с этим, который я могу найти в сети, а также многочисленные итерации своего собственного кода. Ни один из них не был успешным.

'' '

bool playing = false;
                 AudioOutStream dstream = null;
                CancellationTokenSource cancellationToken = new CancellationTokenSource();

                try
                {
                    var reader = new Mp3FileReader(path);
                    var naudio = WaveFormatConversionStream.CreatePcmStream(reader);                    
                    dstream = client.CreatePCMStream(AudioApplication.Voice, 32000);
                    playing = true;            
                    await naudio.CopyToAsync(dstream,50);                    
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message);
                    if (e.InnerException != null)
                        Debug.WriteLine(e.InnerException.Message);
                }

                while (!playing) ; 

                Console.ReadLine();
                cancellationToken.Cancel();
                Debug.WriteLine("Pre-Flush");
                dstream.Flush();
                Debug.WriteLine("POST-FLUSH");

''» Код выше - это «гайки и болты» потокового кода. С этим связано многое другое, но в основном управление и очистка каналов / гильдий, обработка команд и т. Д.

Предполагалось, что этот блок кода будет работать другим постом stackoverflow, но я подозреваю, что это было для discord.net 1.0, и, возможно, поэтому у меня возникла проблема.

Этот код воспроизводит файл, но так быстро, что он непонятен. Файл содержит около 4 секунд звука, но воспроизводится за доли секунды. После окончания игры он никогда не выходит из цикла while, что, по крайней мере, имеет для меня смысл. Тем не менее, без времени или изменения времени, чтобы попытаться определить, когда поток закончен, все не удалось. Это единственный способ получить любой звук для воспроизведения.

Ожидаемый результат: звук будет воспроизводиться с нужной скоростью, а затем завершится и завершится, как и ожидалось.

Любой удар в правильном направлении будет с благодарностью!

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вы проверили битрейт аудио, которое вы посылаете?Это проблема, с которой я столкнулся при создании потока.Я отправлял wav-данные слишком быстро и создал голос бурундука.Вы должны убедиться, что данные, которые вы читаете из своего аудиофайла, и данные, которые вы отправляете в Discord AudioStream, строго совпадают.

0 голосов
/ 13 мая 2019

Вы убедились, что все библиотеки загружены правильно?Это частая причина проблем со звуком у ботов-раздоров.

Здесь - это ответ, который я отправил на другой вопрос.


Вот несколько вещей, которые я вытащилиз официальной гильдии Discord API.

64-разрядная версия Windows: https://dsharpplus.emzi0767.com/natives/vnext_natives_win32_x64.zip
32-разрядная версия Windows: https://dsharpplus.emzi0767.com/natives/vnext_natives_win32_x86.zip
FFmpeg для Windows: https://dsharpplus.emzi0767.com/natives/index.html#ffmpeg-for-windows

Другие ОС:

Примечание для пользователей D.NET: перед использованием необходимо переименовать libopus.dll в opus.dll, в противном случае аудио-клиент все равно будет жаловаться на отсутствующие библиотеки.

Binary Flowchart

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...