涉及的接口有:

IMMDeviceEnumerator

IMMDevice

IAudioClient

IAudioCaptureClient

主要过程:

创建多媒体设备枚举器(IMMDeviceEnumerator)

通过多媒体设备枚举器获取声卡接口(IMMDevice)

通过声卡接口获取声卡客户端接口(IAudioClient)

通过声卡客户端接口(IAudioClient)可获取声卡输出的音频参数、初始化声卡、获取声卡输出缓冲区的大小、开启/停止对声卡输出的采集

通过声卡采集客户端接口(IAudioCaptureClient)可获取采集的声卡输出数据,并对内部缓冲区进行控制

通过声卡输出客户端接口(IAudioRenderClient)可将采集的声音数据写入声音输出设备的缓存单元,输出设备可以通过IAudioClient::GetService函数获取 IAudioRenderClient 接口。

代码示例:

//首先枚举你的音频设备,你可以在这个时候获取到你机器上所有可用的设备,并指定你需要用到的那个设备

hr = CoCreateInstance(

CLSID_MMDeviceEnumerator, NULL,

CLSCTX_ALL, IID_IMMDeviceEnumerator,

(void**)&pEnumerator);

EXIT_ON_ERROR(hr)

hr = pEnumerator->GetDefaultAudioEndpoint(

eCapture, eConsole, &pDevice);

EXIT_ON_ERROR(hr)

//创建一个管理对象,通过它可以获取到你需要的一切数据

hr = pDevice->Activate(

IID_IAudioClient, CLSCTX_ALL,

NULL, (void**)&pAudioClient);

EXIT_ON_ERROR(hr)

hr = pAudioClient->GetMixFormat(&pwfx);

EXIT_ON_ERROR(hr)

//初始化管理对象,在这里,你可以指定它的最大缓冲区长度,这个很重要,应用程序控制数据块的大小以及延时长短都靠这里的初始化,具体参数大家看看文档解释

hr = pAudioClient->Initialize(

AUDCLNT_SHAREMODE_SHARED,

0,

hnsRequestedDuration,

0,

pwfx,

NULL);

EXIT_ON_ERROR(hr)

//这个buffersize,指的是缓冲区最多可以存放多少帧的数据量

hr = pAudioClient->GetBufferSize(&bufferFrameCount);

EXIT_ON_ERROR(hr)

//创建采集管理接口,这个接口很简单,没什么重要的东西

hr = pAudioClient->GetService(

IID_IAudioCaptureClient,

(void**)&pCaptureClient);

EXIT_ON_ERROR(hr)

// Notify the audio sink which format to use.

hr = pMySink->SetFormat(pwfx);

EXIT_ON_ERROR(hr)

// Calculate the actual duration of the allocated buffer.

hnsActualDuration = (double)REFTIMES_PER_SEC *

bufferFrameCount / pwfx->nSamplesPerSec;

hr = pAudioClient->Start(); // Start recording.

EXIT_ON_ERROR(hr)

// Each loop fills about half of the shared buffer.

while(bDone == FALSE)

{

//让程序暂停运行一段时间,缓冲区里在这段时间会被填充数据

Sleep(hnsActualDuration/REFTIMES_PER_MILLISEC/2);

hr = pCaptureClient->GetNextPacketSize(&packetLength);

EXIT_ON_ERROR(hr)

while(packetLength != 0)

{

//锁定缓冲区,获取数据

hr = pCaptureClient->GetBuffer(

&pData,

&numFramesAvailable,

&flags, NULL, NULL);

EXIT_ON_ERROR(hr)

if(flags & AUDCLNT_BUFFERFLAGS_SILENT)

{

pData = NULL;

}

hr = pMySink->CopyData(

pData, numFramesAvailable, &bDone);

EXIT_ON_ERROR(hr)

hr = pCaptureClient->ReleaseBuffer(numFramesAvailable);

EXIT_ON_ERROR(hr)

hr = pCaptureClient->GetNextPacketSize(&packetLength);

EXIT_ON_ERROR(hr)

}

}

hr = pAudioClient->Stop();

EXIT_ON_ERROR(hr)

查看录制的音频可以用 audacity 这个软件

c++采集声卡输出_使用Core Audio实现对声卡输出的捕捉相关推荐

  1. 如何输入一个整数逆序输出_如何理解运算放大器的共模输入和输出摆幅限制?...

    你有没有见过运算放大器意外信号输出的行为?如削波或其他非线性的现象.其原因很可能就是输入共模电压限制或者输出电压摆幅限制.本文章涵盖运算放大器的输入共模电压限制和输出电压摆动限制的理论和相关理论的电路 ...

  2. java10个整数反向输出_输入一个整数,实现反转输出,如输入123,输出321。

    输入一个整数,实现反转输出. Example 1: Input: 123 Output: 321 Example 2: Input: -123 Output: -321 Example 3: Inpu ...

  3. python排列组合结果输出_排列组合总结:将结果进行输出的实现方法

    全排列输出: 解法一: #include /* 递归思想: 取出数组第一个元素放到最后一个元素 即a[0] 和a[n]交换  然后一次递归a[n] 个元素的全排列 1   如果数组只有一个元素 n=1 ...

  4. java怎么将字符串反序输出_对String字符串进行反序输出

    //1. 使用数组循环 public static String array(String s){ int length=s.length(); char[] array=s.toCharArray( ...

  5. c++采集声卡输出_其实声卡不单单只有音效,更多功能看这篇就对了

    其实声卡不仅仅是一块能够发声的卡,而是一块功能众多的多功能卡. 播放数字音乐: 这是声卡最基本的功能,这得益于数字音乐的存储方式的改进.从原始的wav到流行的mp3,在到新兴的wma等音频格式,使得数 ...

  6. springmvc 音频流输出_音频管理模块AudioDeviceModule解读

    最近重构Windows SDK过程中,需要支持外部声音采集.对ADM模块做了点重新阅读,并将基本的内部关系做下记录.ADM算是WebRTC里面比较简单的模块了,结构也比较清晰. WebRTC的音频设备 ...

  7. 使用Core Audio实现VoIP通用音频模块

    最近一直在做iOS音频技术相关的项目,由于单项直播SDK,互动直播SDK(iOS/Mac),短视频SDK,都会用到音频技术,因此在这里收集三个SDK的音频技术需求,开发一个通用的音频模块用于三个SDK ...

  8. 【实战分享】使用Core Audio实现VoIP通用音频模块

    最近一直在做iOS音频技术相关的项目,由于单项直播SDK,互动直播SDK(iOS/Mac),短视频SDK,都会用到音频技术,因此在这里收集三个SDK的音频技术需求,开发一个通用的音频模块用于三个SDK ...

  9. Core Audio音频基础概述

    Core Audio Core Audio提供了数字音频服务为iOS与OS X, 它提供了一系列框架去处理音频. Core Audio中包含我们最常用的Audio Toolbox与Audio Unit ...

  10. Windows Core Audio APIs(一)介绍

    文章目录 Windows Core Audio APIs(一)介绍 Core Audio 架构介绍 Core Audio 架构图 音频高级API Core Audio APIs 共享模式和独占模式 音 ...

最新文章

  1. 【原创】关于部门月会(二)
  2. ecshop订单-》待付款,待发货,待收货,收货确认
  3. linux环境下安装PHP中间件ICE(二)
  4. C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中
  5. 高仿微信对话列表滑动删除效果
  6. 使用alertmanager对监控对象进行报警(微信)三
  7. lambda 序列化_如何以及为什么要序列化Lambda
  8. web窗体的内置对象
  9. 遍历文件夹下所有文件和文件夹
  10. 华为2019年校招(20届实习)机考题python版解答与思路(2019-3-13软件题)
  11. add php support,wordpress函数add_post_type_support()用法示例
  12. 携Science封面、NIPS最佳论文,CMU大神博士毕业论文公开
  13. 2.2 logistic 回归
  14. VirtualBox 安装 增强功能
  15. linux达梦服务重启,如何重启达梦数据库服务
  16. 手机连接Fiddler后无法上网(已解决)
  17. 图片加水印怎么操作?来试试这几个简单的方法
  18. 重新认识融云,「不止即时通讯」
  19. 剑指offer——树的子结构
  20. 织梦模板修改方法大全

热门文章

  1. 02333软件工程_201910_试卷+答案
  2. 计算机c语言实验心得与小结,C语言实验心得体会
  3. 【运维面试】面试官: 你们公司的上线流程是怎么样的?
  4. python写出租车计费系统_关于使用Python——写出租车计费系统
  5. 南方cass提取坐标生成表格_南方cass方格网角点坐标及高程的识别与导出
  6. 窃取5亿雅虎用户信息的黑客 被判处5年有期徒刑
  7. free pascal语言学习笔记(一)
  8. 12.学习Camera之——android binder 机制架构
  9. Saber 基本操作学习-Buck仿真实例
  10. python课程设计实验报告-python课程设计