捕获声音输出

时间:2014-05-21 05:32:46

标签: c# windows audio

我需要做的是在我的扬声器上播放音频流,而无需任何额外的硬件。

如果有扬声器输出(比如说人声),那么我需要显示一些图像。那么如何确定扬声器是否有声音?

我想在Windows 7上使用C#。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用WASAPI Loopback Capture执行此操作。我的开源NAudio库包含一个名为WasapiLoopbackCapture的包装器。 WASAPI Loopback Capture的一个怪癖就是当系统播放静音时你没有得到任何回调,尽管这对你来说无关紧要

如果您实际上不需要检查样本的值,WASAPI还允许您监视设备的音量级别。在NAudio中,您可以使用AudioMeterInformation上的AudioEndpointVolumeMMDevice来访问此内容(您可以使用MMDeviceEnumerator.GetDefaultAudioEndpoint进行渲染)

答案 1 :(得分:0)

您可以使用CSCore来获取任何应用程序和整个设备的峰值。您可以通过检查峰值来确定是否播放声音。这是关于如何获得应用程序峰值的example。这些是如何获得一个特定设备的峰值的两个例子:

    [TestMethod]
    [TestCategory("CoreAudioAPI.Endpoint")]
    public void CanGetAudioMeterInformationPeakValue()
    {
        using (var device = Utils.GetDefaultRenderDevice())
        using (var meter = AudioMeterInformation.FromDevice(device))
        {
            Console.WriteLine(meter.PeakValue);
        }
    }

    [TestMethod]
    [TestCategory("CoreAudioAPI.Endpoint")]
    public void CanGetAudioMeterInformationChannelsPeaks()
    {
        using (var device = Utils.GetDefaultRenderDevice())
        using (var meter = AudioMeterInformation.FromDevice(device))
        {
            for (int i = 0; i < meter.MeteringChannelCount; i++)
            {
                Console.WriteLine(meter[i]);
            }
        }
    }

检查是否存在大于零的峰值或类似0.05的峰值(您可能需要对其进行试验)。如果峰值大于某个值,则有任何应用程序在播放某些内容。

另请看一下:http://cscore.codeplex.com/SourceControl/latest#CSCore.Test/CoreAudioAPI/EndpointTests.cs。要获得Utils.GetDefaultRendererDevice的实现,请参阅以下内容:http://cscore.codeplex.com/SourceControl/latest#CSCore.Test/CoreAudioAPI/Utils.cs

第一个示例获取所有通道峰值的平均峰值,第二个示例获取输出设备的每个通道的峰值。