读取系统音频输出流

时间:2011-07-22 04:42:55

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

我目前正在为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

由于我无法完全掌握应该做什么,所以我谦卑地向你寻求帮助。谢谢你们。不久。

2 个答案:

答案 0 :(得分:5)

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。然后循环浏览所有可能的输入源,搜索“What U Hear”或“Stereo Mix”。所有扬声器输出组合的通道名称因声卡和声卡而异,因此您必须获取常用名称列表。找到合适的频道后,您将开始录制。 MyRecording方法将有一个缓冲区供您分析。

这只是一种方法,只需一个库。浏览一下,看看哪个库以您希望的格式提供数据。

答案 1 :(得分:0)

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