我可以在 c# 中使用 Console.Beep 播放 mp3 文件吗?
Posted
技术标签:
【中文标题】我可以在 c# 中使用 Console.Beep 播放 mp3 文件吗?【英文标题】:Can I play mp3 files using Console.Beep in c#? 【发布时间】:2013-11-06 08:31:53 【问题描述】:有没有什么方法可以在没有扬声器的情况下使用Console.Beep
播放mp3
?
【问题讨论】:
+1 为这个令人毛骨悚然的想法! :-D 欢迎来到 ***。到目前为止,您尝试过什么吗?首先展示你的努力,这样人们就可以展示他们的努力。请阅读FAQ和How to Ask 哔声是错误处理功能之一,您想在应用程序出现问题时播放 mp3 :) ? 在学校,我们没有扬声器,我想播放任何音乐。如果我可以将 mp3 文件转换为 .MID 然后使用 console.beep 或任何可以通过主板的蜂鸣器发出声音的东西来播放它也是很好的。 【参考方案1】:这是不可能的。音乐由不同音量级别的许多频率组成,所有频率混合在一起形成复杂的波形。随时间变化非常迅速的组合。
Console.Beep() 仅产生 一个 频率,无法控制音量。随着时间的推移改变频率的能力也受到严格限制,过渡并不平滑。它永远不会听起来像哔哔声。
播放 MP3 需要能够将数字信号转换为驱动扬声器的模拟信号的设备。现在可以在任何机器上使用,集成在主板上。还 used today 产生 Console.Beep() 声音,现代机器不再有扬声器了。
【讨论】:
我发现了一些东西:***.com/questions/1643122/… 它是什么?我可以用它来做这个吗,或者它是用来做其他事情的吗?【参考方案2】:我试图做一些类似的事情,即给定一个 mp3 文件,我试图生成 Console.Beep 命令来表示音频信号的近似值。 Goertzel 算法是查找样本频率的良好开端,并且可以使用传递给算法的样本量轻松计算持续时间。
我发现这种方法非常适用于统一和连续的音频信号,但是如果您想转换更复杂的东西,比如一首歌曲,它会丢弃主要功能,只为您的整体频率提供一个粗略的近似值给定的样本反过来使其无法识别您的输入。
这是我使用的算法的代码:
private static double GoertzelAmplitude(IReadOnlyList<float> samples, double freq, int sampleRate)
var tmp1 = 0.0;
var tmp2 = 0.0;
var normalizedfreq = freq / sampleRate;
var coeff = 2 * Math.Cos(2 * Math.PI * normalizedfreq);
for (var i = 0; i < samples.Count; i++)
var newTerm = samples[i] + coeff * tmp1 - tmp2;
tmp2 = tmp1;
tmp1 = newTerm;
var power = tmp2 * tmp2 + tmp1 * tmp1 - coeff * tmp1 * tmp2;
return power;
【讨论】:
【参考方案3】:http://msdn.microsoft.com/en-us/library/4fe3hdb1(v=vs.110).aspx 解释了如何使用 Beep(Int32, Int32) 方法来播放歌曲的前几个音符。
但是,这有两个大问题:console.beep 在 64 位 windows 7 和 windows XP 上不受支持,并且在任何 ME 或更低版本上都不会出现 2 个 Int32 参数过载。
如果您想这样做,您的歌曲有 2 个选项:第一个是对您的歌曲进行硬编码。如果您希望歌曲可以互换,您可以使用 Intelliscore (http://www.intelliscore.net/) 之类的 MP3 解析器将歌曲读入 .MID 文件,然后再次读取该 .MID 文件。
【讨论】:
我如何从 .MID 文件中获取音调的频率?我不想使用第三方软件。以上是关于我可以在 c# 中使用 Console.Beep 播放 mp3 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章
C# - Console.Beep 在 Windows Vista 上不起作用