读取系统音频输出流

本文关键字:输出流 音频 系统 读取 | 更新日期: 2023-09-27 18:03:23

我目前正在制作XNA示波器组件,需要一些帮助。我想从系统音频输出流中获得音频信息,但是我发现这样做非常困难。我已经找到了一些资源,但没有什么可以帮助我,或者它在某种程度上帮助我无法掌握。以下是我到目前为止找到的参考资料。

如何以编程方式获得当前的音频水平?

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

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

由于我不能完全掌握该怎么做,我谦卑地来到你的帮助谢谢你的变化很大

读取系统音频输出流

DirectSound有很多细微差别,这使得它很难使用。如果你愿意使用一些第三方选项,有一些免费的选项可以抽象DirectSound的技术细节,使这个问题更容易解决。我个人推荐BASS。如果你对完全托管的解决方案更感兴趣,那么NAudio是很好的选择。

低音。,你的代码看起来像这样:

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方法将有一个缓冲区供您分析。

这只是使用一个库的一种方法。查看一下周围的库,看看哪个库能以您想要的格式提供数据。

XNA包含一个MediaPlayer类,可以让您访问一些"可视化数据"(频率及其体积的采样)。看一下这个教程