声卡数据采集

Loopback 录制模式

在 loopback 模式下,WASAPI 的客户端可以捕获 rendering endpoint 设备(通常即声卡)正在播放的音频流。

客户端只能为共享模式流(AUDCLNT_SHAREMODE_SHARED)启用 loopback 模式。 独占模式(AUDCLNT_SHAREMODE_EXCLUSIVE)流不能在 loopback 模式下运行。

WASAPI 系统模块在软件中实现环回模式。在 loopback 模式下,WASAPI 将来自音频引擎的输出流复制到应用程序的捕获缓冲区中。

Windows 从 Vista 开始支持数字版权管理(DRM)。内容提供商依靠 DRM 来保护其专有音乐或其他内容免受未经授权的复制和其他非法使用。WASAPI 不允许 loopback 录制包含 DRM 保护内容的数字流。

无论音频源自哪个终端服务会话(session),WASAPI loopback 都包含正在播放的所有音频的混合。

Loopback 录制代码

以下是概要的 loopback 录制代码,省略类的具体实现和错误处理:

CWavFileHelper g_recWavFile;
void onAudioCaptured(BYTE* pData, DWORD len) 
{
   
   
    g_recWavFile.append((const char*)pData, len);
}

int _tmain(int argc, _TCHAR* argv[]) 
{
   
   
    HRESULT hr = E_FAIL;
    hr = CoInitialize(NULL);
    
    LoopackAudCap audCap;
    hr = audCap.init(onAudioCaptured);
    hr = g_recWavFile.create(argv[1], *audCap.getWavFormat());
    hr = audCap.start();
    
    _tprintf(_T("Started recording...press Enter to stop recording.\n"));   
    
    char ch = getchar(); // wait for keyboard input and then stop the recording
    hr = audCap.stop();
    
    audCap.finaize();
    g_recWavFile.close();
    CoUninitialize();
    return hr;
}

LoopackAudCap::init 函数

typedef void (*PFON_AUD_CAPTURED)(BYTE* pData, DWORD len);

HRESULT init(PFON_AUD_CAPTURED pCallback)
{
   
   
    HRESULT hr = E_FAIL;
    CComPtr<IMMDevice> pSpeaker = NULL;
    MMDeviceHelper device;
    WAVEFORMATEX *pwfx = NULL;
    
    m_pCallback = pCallback;
    m_hStartEvent = CreateEvent<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值