【问题标题】:Reading The System Audio Output Stream读取系统音频输出流
【发布时间】:2011-07-22 04:42:55
【问题描述】:

我目前正在为 XNA 制作示波器组件,需要一些帮助。我想从系统音频输出流中获取音频信息,但是我发现这样做非常困难。我找到了一些资源,但没有什么能一直帮助我,或者它以我无法掌握的方式有所帮助。以下是我目前发现的以下资源。

How to programmatically get the current audio level?

http://msdn.microsoft.com/en-us/library/ms712636

http://social.msdn.microsoft.com/Forums/en/xnagamestudioexpress/thread/6a3ea3da-849b-475d-a2a4-7cf7c27347d5

由于我无法完全掌握该怎么做,我虚心地向您寻求帮助,非常感谢您。

【问题讨论】:

  • 这个问题比听起来更具挑战性。 DirectSound 有很多微妙的行为。我发现有一些很好的第 3 方解决方案可以真正帮助抽象这一点。您愿意使用免费的外部库吗?我个人推荐 BASS.NET,如果你想要一个完全托管的解决方案,NAudio 是不错的选择。
  • @JacobJ 感谢您的反馈,我会调查这两个问题,并回复我的结果。
  • JacobJ,您介意发表您的评论作为答案,以便我们这样对待吗?

标签: c# winapi audio .net-4.0 xna


【解决方案1】:

DirectSound 有很多细微差别,可能会使其难以使用。如果您愿意使用一些第三方选项,可以使用一些免费的选项来抽象 DirectSound 的技术细节并使这个问题更容易解决。我个人推荐 BASS.NET - 如果您对完全托管的解决方案更感兴趣,NAudio 是不错的选择。

在 BASS.NET 中,您的代码如下所示:

private RECORDPROC _myRecProc; // make it global, so that the Garbage Collector can not remove it
...
Bass.BASS_RecordInit(-1);
_myRecProc = new RECORDPROC(MyRecording);
// start recording paused
int settings = 0;
int inputSource = 0;
while (settings != -1)
{
  // get the settings of that input
  settings = Bass.BASS_RecordGetInput(inputSource, ref vol);
  if ( Bass.BASS_RecordGetInputName(inputSource) == "What U Hear" ||
       Bass.BASS_RecordGetInputName(inputSource) == "Stereo Mix")
  { 
    break;
  }
  inputSource++;
}    

Bass.BASS_RecordSetInput(inputSource, BASSInput.BASS_INPUT_ON, 0.5F)

int recChannel = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, 50, _myRecProc, IntPtr.Zero);
...
// really start recording
Bass.BASS_ChannelPlay(recChannel, false);
...
// the recording callback
private bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)
{
  return true;
}

基本上,您正在初始化 BASS。然后循环搜索“你听到什么”或“立体声混音”的所有可能输入源。作为所有扬声器输出组合的通道名称因声卡而异,因此您必须获取常用名称列表。找到合适的频道后,您将开始录制。 MyRecording 方法将有一个缓冲区供您分析。

这只是使用一个库的一种方法。环顾四周,看看哪个库以您想要的格式为您提供数据。

【讨论】:

  • 嘿,我正在计划自己解决这个问题,但非常感谢你,我也会积极加入对项目的感谢 ^_^
【解决方案2】:

XNA 包含一个 MediaPlayer 类,可让您访问一些“可视化数据”(频率及其音量的采样)。查看this 获取教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2018-12-03
    • 2014-09-21
    相关资源
    最近更新 更多