【发布时间】:2018-05-16 11:23:43
【问题描述】:
我一直在尝试读取音频输入的当前音频电平,使用该数据更新进度条,并使用 VS2015 中的 NAudio NuGet 包(实际上是 3 个输入)使用该数据做出决定,但可以只有在声音控制面板打开并在录制选项卡上时才能获得音频电平。
在 Naudio AudioMeterInformation 和 Audio level meter for NAudio recording 上有一些帖子,但我似乎无法让它工作,我显然在这里遗漏了一些东西,但就是不明白,谁能帮忙。如果有更好的方法可以做到这一点,我愿意提供任何帮助
这就是我正在做的事情,在应用启动时,我会检查声音设备并将它们放在组合框中
public void runGUISetup()
{
//Check for ini file
if (File.Exists(iniFile))
{
// Set the IP Address of Vmix from INI File
if (VmixIPAddress.Value != "")
{
tbVmixIPAddress.Text = VmixIPAddress.Value;
}
else
{
}
}
try
{
// Enumerate soundcards and add to combobox
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
var devices = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
cBoxSoundCard1.Items.AddRange(devices.ToArray());
cBoxSoundCard2.Items.AddRange(devices.ToArray());
cBoxSoundCard3.Items.AddRange(devices.ToArray());
//Enumerate IP Local Addresses
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
//Populate the drop down list with local IP's
cbListeningServerIP.Items.AddRange(ipHostInfo.AddressList);
}
catch (Exception erSoundcard)
{
tbDebug.Text += erSoundcard.Message;
}
然后我运行一个计时器来收集当前音频电平并将其转储到移动平均线中,然后更新进度条。这是失败的位,仅在声音属性打开时才有效。
// check audio level every 10ms and store in moving average
private void tmrSC1_Tick(object sender, EventArgs e)
{
if (appActive == true)
{
if (cBoxSoundCard1.SelectedItem != null)
{
var device1 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard1.SelectedItem;
avg1.AddSample((device1.AudioMeterInformation.MasterPeakValue * 100));
}
else
{
}
if (cBoxSoundCard2.SelectedItem != null)
{
var device2 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard2.SelectedItem;
avg2.AddSample((device2.AudioMeterInformation.MasterPeakValue * 100));
}
else
{
}
if (cBoxSoundCard3.SelectedItem != null)
{
var device3 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard3.SelectedItem;
avg3.AddSample((device3.AudioMeterInformation.MasterPeakValue * 100));
}
else
{
}
}
}
更新: 根据 Kris 的反馈,它确实有效,但只有当我对设备编号进行硬编码时,枚举声音设备(wave 和 coreaudioAPI)的两种不同方式之间的差异,设备编号不同,每个设备的描述也不同,所以我猜我需要匹配其他一些时尚的设备名称?虽然这似乎很容易失败。我可能是错的,因为我是新手。任何帮助都会得到极大的欢迎。它也让我感到震惊,也许我可以使用相同的方法制作设备列表? (coreaudioAPI),然后将设备放入录制,我只是不知道该怎么做。
【问题讨论】:
-
我仍在为此苦苦挣扎,我似乎无法理解它。
标签: c# audio core-audio audio-recording naudio