将 MP3 流式传输到 Discord.net 2.0 - 音频速度超快(花栗鼠)。想法?

Posted

技术标签:

【中文标题】将 MP3 流式传输到 Discord.net 2.0 - 音频速度超快(花栗鼠)。想法?【英文标题】:Streaming MP3 to Discord.net 2.0 - audio is super-fast (chipmunk). Ideas? 【发布时间】:2019-09-25 08:16:24 【问题描述】:

我正在使用网上找到的示例混搭,通过 Discord.net 2.0 (c#) 将音频从 MP3 文件发送到不和谐频道。

发送任何音频都需要很长时间......现在我至少可以正常工作了,音频非常快 - 就像花栗鼠的速度一样。

作为背景,虽然我在这里使用静态 mp3 文件,但实际上我将使用谷歌云文本到语音引擎来生成将要发送的流 - 但希望首先使用已知文件。

我对开发并不陌生,但我对处理任何类型的音频都很陌生。我了解音频是如何工作的 - 在这种情况下,问题应该与比特率有关,但情况似乎并非如此,因为我手动将流的比特率设置为文件的比特率(我已经尝试更改它没有效果)。

此外,我对您将在下面的代码中看到的 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");

''' 上面的代码是流代码的“具体细节”。上面和下面还有很多与之相关的内容,但主要是频道/公会管理和清理、命令处理等。

这个代码块据称是由另一个***帖子工作的,但我怀疑它是针对discord.net 1.0的,这可能是我遇到问题的原因。

这段代码可以播放文件,但速度太快以至于无法理解。该文件包含大约 4 秒的音频,但它会在几分之一秒内播放。播放完毕后,它永远不会退出 while 循环,这至少对我来说是有意义的。也就是说,如果没有 while 或修改 while 以尝试检测流何时完成,都失败了。这是我可以播放任何音频的唯一方法。

预期结果是音频以正确的比特率播放,然后按预期退出并刷新。

任何正确方向的踢都将不胜感激!

【问题讨论】:

【参考方案1】:

您是否确保已正确加载所有库?这是不和谐机器人中音频问题的常见原因。

Here 是我为另一个问题发布的答案。


这些是我从官方 Discord API 公会中提取的一些内容。

Windows 64 位:https://dsharpplus.emzi0767.com/natives/vnext_natives_win32_x64.zip Windows 32 位:https://dsharpplus.emzi0767.com/natives/vnext_natives_win32_x86.zip FFmpeg for Windows:https://dsharpplus.emzi0767.com/natives/index.html#ffmpeg-for-windows

其他操作系统:

GNU/Linux:https://dsharpplus.emzi0767.com/articles/vnext_setup.html#gnulinux-1

OS X:https://dsharpplus.emzi0767.com/articles/vnext_setup.html#mac-os-x-1

FreeBSD:https://dsharpplus.emzi0767.com/articles/vnext_setup.html#freebsd

D.NET 用户注意:使用前需要将 libopus.dll 重命名为 opus.dll,否则音频客户端仍然会报错库。

【讨论】:

【参考方案2】:

您是否检查过您发送的音频的比特率? 这是我在创建流时遇到的问题。我发送 wav 数据的速度太快了,并创建了花栗鼠的声音。您必须确保从音频文件中读取的数据与发送到 Discord Audiostream 的数据完全相同。

【讨论】:

以上是关于将 MP3 流式传输到 Discord.net 2.0 - 音频速度超快(花栗鼠)。想法?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Yeti lame 包装器将音频流式传输到 mp3 文件

将 mp3 从服务器流式传输到 html5 音频时传递持续时间

加密的 mp3 流式传输到 Flash SWF

iOS 上的 MP3 流式传输

如何将媒体文件从服务器流式传输到客户端,例如我在 loopback 4 nodejs 中的 mp3 音频文件?

在 Swift 3 中从服务器流式传输 mp3 文件