2007年,在Windows Vista中包含DRM发烧期间,创建了一个Windows Vista团队博客,以回应许多问题.其中一个问题回应了VoIP软件在Windows Vista上运行时执行回声消除的能力.
这就是Nick White通过常见问题解答所说的话:
回声消除对优质内容的影响是否会降低?
我们相信Windows Vista为应用程序提供了足够的信息,可以成功构建高质量的回声消除功能.
Windows Vista提供哪些信息以允许应用程序构建高质量的回声消除功能?
注意:阅读该声明,我得到的印象是Windows Vista提供了足够的信息,使应用程序能够成功构建高质量的回声消除功能.据推测,Windows提供此信息的方式是通过API.
回声消除的工作原理是对播放输出进行采样,并从录制的麦克风输入中" 减去 ".
不幸的是,正如MSDN所说,人们不能总是对播放输出进行采样:
Windows Vista提供数字版权管理(DRM).内容提供商依靠DRM来保护其专有音乐或其他内容免受未经授权的复制和其他非法使用.WASAPI不允许环回记录包含受DRM保护的内容的数字流.类似地,可信音频驱动程序不允许环回设备捕获包含受保护内容的数字流.Windows Vista仅允许受信任的驱动程序播放受保护的内容.有关受信任驱动程序和DRM的详细信息,请参阅Windows DDK文档.
据推测,这意味着使用WASAPI的环回模式不是提供回声消除服务的预期方法.
什么是允许实现高质量回声消除的API?
注意:这与我提出的另一个问题有关,但是是分开的:如何对输出音频混合进行采样?.这个问题专门针对Window Vista团队的响应扩展,即在Windows中可以进行回声消除.这个问题正在寻求为的API; 它可以是一个如何使用它的单独问题.
谷歌搜索答案,我得到的印象是(在执行回声消除时)允许应用程序对受DRM保护的内容进行采样,但内容将降级(即"足够的信息").这将使任何回声消除更糟,但仍然可能.
或者Windows团队暗示" 足以满足大多数情况,但不是在用户正在收听歌曲或播放电影时 " - 并且事实上不可能成功构建高质量的回声消除功能?
更新:应该注意我不是在寻找回声消除API,我正在寻找一个API来对播放输出进行采样 - 这是实现回声消除所需要的.除非Windows Vista提供回声消除API(这是他们继续保护高级内容的方式).但我也没见过回声消除API.
我正在尝试编写一个C#代码,用于从访问声音输出的每个窗口应用程序输出当前音频输出级别(如Volume混音器中不断变化的绿色条所示).
该程序将每10毫秒检查一次,并输出如下:Windows Media Player:30,Mozilla Firefox:0,Adobe Flash Player:35(根据图)
我正在使用Windows 7,并在C#中尝试它(因为Java无法实现这一点).
我已经找到了为正在运行的应用程序获取和设置主音量(对于Windows Media Player显示65%的句柄栏)的方法,有没有办法获得绿色波动的水平数据?
谢谢!

有谁知道对 AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 流标志的支持是何时添加到 WASAPI 的?MSDN 简要提到了这个标志,但没有详细介绍它的使用以及哪些版本的 Windows 支持它。
我正在使用 Visual Studio 2015 附带的平台 SDK,甚至没有定义 AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM。
以下是我录制来自演讲者的音频的示例代码.它工作正常.但是只有当某些音频从扬声器发出时才录制音频.如果没有音频则不记录.实际上我正在用系统的声音进行屏幕录制.由wasapiloop录制的音频长度与屏幕录制长度不匹配,因为wasapiloop仅在有来自扬声器的声音时才录制音频.
WasapiCapture waveLoop = new WasapiLoopbackCapture();
waveLoop.Initialize();
waveLoop.DataAvailable += waveLoop_DataAvailable;
waveLoop.Stopped += waveLoop_Stopped;
waveLoop.Start();
Run Code Online (Sandbox Code Playgroud)
我已经看到一个类似的堆栈流量问题,但我完全不理解它.
任何帮助是极大的赞赏.
对于 IMMDevice,我是一个完全的初学者,我需要问一下,从某些设备中获取信息的好、简单的方法是什么。在我的程序中,我已经使用 GetDefaultAudioEndpoint() 成功设置了指向其中之一的指针。现在我只需要能够从中获取一些基本信息,例如一些演讲者信息或演讲者的 ID 或类似的信息。有什么好方法可以让初学者能够掌握呢?谢谢!
我正在尝试使用WASAPI打开带有输出设备的独占流.我在选择可接受的格式时遇到问题,因为似乎没有关于给定设备接受哪种格式的提示.
就我而言,IAudioClient::GetMixFormat(),否则会返回一个类型的默认格式为设备,返回不能以独占模式(使用的格式IAudioClient::IsFormatSupported()返回AUDCLNT_E_UNSUPPORTED_FORMAT).我不知道从哪里去.有一些荒谬的波形参数组合 - 我真的必须迭代它们中的每一个直到有效吗?
我正在学习Windows Core Audio API.使用这个Rendering a Stream示例,我发现IAudioClient :: GetMixFormat返回一个模糊的WAVEFORMATEXTENSIBLE,如下所示:
Format
wFormatTag = WAVE_FORMAT_EXTENSIBLE (65534)
nChannels = 2
nSamplesPerSec = 48000
nAvgBytesPerSec = 384000
nBlockAlign = 8
wBitsPerSample = 32
cbSize = 22
Samples // this is a union
wValidBitsPerSample = 32
wSamplesPerBlock = 32
wReserved = 32
Run Code Online (Sandbox Code Playgroud)
从Format.cbSize22岁起,这就是整个结构; 没有SubFormatGUID可以提供有关样本的更多信息.这看起来很奇怪,因为格式标签是WAVE_FORMAT_EXTENSIBLE- 我认为 - 意味着您必须依靠SubformatGUID来确定实际格式.
我可以看到有两个32位采样通道.如何确定这些样本是整数还是浮点值?
[ 核心音频标签显然是用于Apple API.Windows Core Audio是否有不同的标签?]
问题:我创建了一个服务,该服务应该在提升的权限下运行。现在我有了一个可供用户访问的应用程序。应用程序希望通过命名管道与服务通信。命名管道由服务创建。
但是我无法打开管道,因为 ERROR_ACCESS_DENIED。问题:如何在服务中设置管道,以便应用程序能够写入/打开它?
我读过这篇文章,但它根本没有帮助。我很高兴看到提示或代码示例。
背景:我需要更改音频设备的设置,这可以通过通过 IMMDevice::OpenPropertyStore 调用获取的 IPropertyStore 接口来完成。然而,文档清楚地表明,如果我没有管理权限,我就无法执行此操作。显然,我不想每次用户旋转旋钮时都会使用 UAC 来惹恼用户。为此,我创建了上述服务。但再次没有运气。
我正在阅读诸如“捕获流”或“环回录音”之类的文档,但我找不到关于如何从环回音频设备(有时称为“什么使用 Windows WASAPI 聆听”、“立体声混音”)。
您是否有一个简单的可重现示例,展示如何使用 C++ 从 WASAPI 设备循环录制音频块?
这是 Python 中的一个类似(有效)示例:
import soundcard as sc # installed with: pip install soundcard
lb = sc.all_microphones(include_loopback=True)[0]
with lb.recorder(samplerate=44100) as mic:
while True:
data = mic.record(numframes=None)
print(data) # chunks of audio data (448 samples x 2 channels as an array by default)
Run Code Online (Sandbox Code Playgroud) 我正在使用 Visual Studio 2010 并包含以下标头:
#include <Audioclient.h>
#include <mmdeviceapi.h>
Run Code Online (Sandbox Code Playgroud)
除其他外,参考这些功能:
CoCreateInstance
IMMDeviceEnumerator::GetDefaultAudioEndpoint
IMMDevice::Activate
Run Code Online (Sandbox Code Playgroud)
我已经链接了 winmm.lib,但我收到了这样的错误:
Error 8 error LNK2001: unresolved external symbol _IID_IMMDeviceEnumerator C:\XXXX\XXXX\XXXX.obj XXXX
Run Code Online (Sandbox Code Playgroud)
我需要链接什么 .lib 文件才能使用这些函数?是否有关于如何在 VS 2010 中找到与 .h 文件关联的 .lib 的任何指导?
我正在查看来自 MSDN 的一些示例代码,但找不到需要链接的库。