【问题标题】:CSCore Application Audio Mixer Name+PeakCSCore 应用混音器名称+峰值
【发布时间】:2014-07-22 20:46:56
【问题描述】:

我尝试获取 processID 例如 5640 - Spotify 的峰值(win7 音频混合器中绿色条的电平)。

在互联网上搜索了一个好的图书馆。我找到了 CSCore。

现在我有了这个:

class Program
{
    static void Main(string[] args)
    {
        using (var sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render))
        {
            using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
            {
                foreach (var session in sessionEnumerator)
                {
                    using (var audioMeterInformation = session.QueryInterface<AudioMeterInformation>())
                    {
                        Console.WriteLine(audioMeterInformation.GetPeakValue()*100);
                    }

                }
            }
        }

        Console.ReadKey();
    }

    private static AudioSessionManager2 GetDefaultAudioSessionManager2(DataFlow dataFlow)
    {
        using (var enumerator = new MMDeviceEnumerator())
        {
            using (var device = enumerator.GetDefaultAudioEndpoint(dataFlow, Role.Multimedia))
            {
                Debug.WriteLine("DefaultDevice: " + device.FriendlyName);
                var sessionManager = AudioSessionManager2.FromMMDevice(device);
                return sessionManager;
            }
        }
    }

}
}

http://cscore.codeplex.com/ 的文档对我没有帮助。有人可以用我的代码给我一个例子吗,我怎样才能得到这样的输出:

58,31232---进程 ID---Spotify

目前看起来是这样的:

【问题讨论】:

  • 这是一个高峰的例子。如果我听音乐,高峰会不断变化。如果您执行它,它会显示代表正在运行的音频应用程序的值(峰值)。但我不能分配它。我需要一个名称和输出中的峰值。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# .net wpf audio cscore


【解决方案1】:

你可以将你的代码修改成这样(也可以看看 cscore 的单元测试):

class Program
{
    static void Main(string[] args)
    {
        using (var sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render))
        using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
        {
            foreach (var session in sessionEnumerator)
            {
                Assert.IsNotNull(session);

                using (var session2 = session.QueryInterface<AudioSessionControl2>())
                using (var audioMeterInformation = session.QueryInterface<AudioMeterInformation>())
                {   
                    Debug.WriteLine("Process: {0}; Peak: {1:P}", 
                        session2.Process == null ? String.Empty : session2.Process.MainWindowTitle,
                        audioMeterInformation.GetPeakValue()*100);
                }
            }
        }

        Console.ReadKey();
    }

    private static AudioSessionManager2 GetDefaultAudioSessionManager2(DataFlow dataFlow)
    {
        using (var enumerator = new MMDeviceEnumerator())
        {
            using (var device = enumerator.GetDefaultAudioEndpoint(dataFlow, Role.Multimedia))
            {
                Debug.WriteLine("DefaultDevice: " + device.FriendlyName);
                var sessionManager = AudioSessionManager2.FromMMDevice(device);
                return sessionManager;
            }
        }
    }
}

【讨论】:

  • 好的,谢谢!但是您的代码中不知道 sessionEnumerator 。如果我添加它 Assert.IsNotNull 无法访问,因为安全级别。你能更正你的代码吗?
  • 我已经更改了我的代码...但是如果您看一下您的问题,您会发现您已经完成了所有必要的操作。我只是忘了复制一行代码:using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
  • 我试过你的代码。但是“Assert.IsNotNull(session);”在当前上下文中不可用。
  • 将您的代码放入 VisualStudio 并查看。
  • 你不需要那个。它只是从单元测试中复制的......删除它。就是这样。
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2014-07-30
  • 2019-09-20
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多