对于一个音频应用程序,最基本也是最重要的两个点就是:音频数据的采集;音频数据的播放。下面我们来看下如何用Core Audio APIS进行音频数据的采集。

最权威的学习资料无疑是微软的MSDN官方资料,先给出链接地址,大家可以先去阅读下文档,虽然是英文,但挺好理解的,https://msdn.microsoft.com/en-us/library/dd370800(v=vs.85).aspx

首先我们来了解下面几个概念:

1. IMMDevice : 创建音频设备终端,我们可以把它简单的理解为设备对象

2. IAudioClient : 创建一个用来管理音频数据流的对象,应用程序通过这个对象可以获取的音频设备里的数据,我们可以把它想象成一个大水池,里面都是一些数据

3.  IAudioCaptureClient : 很明显,专用于获取采集数据的对象,它还有个兄弟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)

代码就这么多,这是官网给出的最简单的一个关于获取音频数据的示例,这里面取到的数据是最原始的,我们可以对这些数据进去任何处理,达到我们需要的效果。

对于初学者来说(比如笔者),文中的pMySink会让大家感到迷惑。大家都能猜到这个是自定义的一个类的对象,用来拷贝数据的,但里面做了一些什么,我们却不清楚。我这里多说一些(大牛请无视下面的话):

音频数据量的计算:数据量(字节/秒)= (采样频率(Hz)*采样位数(bit)*声道数)/ 8

我们回顾下代码,创建完管理对象后,我们就可以获取到当前设备的音频数据的格式,然后对pMySink设置了数据格式

hr = pAudioClient->GetMixFormat(&pwfx);//这里面就可以获取的数据格式:频率,采集位数,声道数

hr = pMySink->SetFormat(pwfx);//指定数据格式,计算数据量

这就决定了,pMySink每一次读取数据量的大小,保证我们在获取的每一帧数据都是正确的

hr = pMySink->CopyData(pData, numFramesAvailable, &bDone);

这里就是简单的拷贝数据了

Windows下Core Audio APIS 音频应用开发(二)相关推荐

  1. Windows下Core Audio APIS 音频应用开发(五)

    之前做开发是一直有个疑问(博主qq,1204802552,欢迎交流) 按照Core Audio上面的文档,音频设备本身会有个设备周期,这个周期决定了音频设备所能缓存的最大数据量:而另外一方面,我们在初 ...

  2. Windows下Core Audio APIs的使用简介

    文|网易云信资深PC端开发工程师 Windows Vista 之后的系统中,音频系统相比之前的系统有很大的变化,产生了一套新的底层 API 即 Core Audio APIs . 该低层 API 为高 ...

  3. Windows Core Audio APIs(一)介绍

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

  4. myeclipse怎么运行c语言,windows下MyEclipse安装配置C/C++开发环境

    windows下MyEclipse安装配置C/C++开发环境 ,安装MinGW:假设安装路径为c:\MinGW 编辑如下系统变量: 变量名变量值 PATH C:\MinGW\bin; LIBRARY_ ...

  5. Windows下使用VSCode远程搭建Linux开发平台

    Windows下使用VSCode远程搭建Linux开发平台 前言 1.开启Windows的SSH功能 1.1.打开设置,进入应用 1.2.进入可选功能 1.3.安装SSH功能 2.开启Linux的SS ...

  6. windows下使用waveOut播放音频pcm

    目录 一.前言 二.waveOut主要API介绍 三.waveOut播放PCM音频框架 <Windows平台使用waveOut播放PCM数据代码实现>链接: https://edu.csd ...

  7. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

  8. windows下delf配置:delf环境(二)

    windows下delf配置:基础环境(一) windows下delf配置:delf环境(二) 一.delf基础package 1.1.安装tf-Slim cd c:\dlenv git clone ...

  9. Windows下使用ffmpeg采集音频视频

    前言 本文介绍一下ffmpeg在windows下采集音频的相关命令. 一开始在命令行下使用ffmpeg时执行"ffmpeg -list_devices true -f dshow -i du ...

最新文章

  1. list_for_each_safe
  2. 北欧小国的宏大AI实验: 让1%的人口接受人工智能培训
  3. querySelector
  4. 队列不存在,或您没有足够的权限执行该操作-另一种原因
  5. PAT甲级1059 Prime Factors :[C++题解]分解质因子
  6. RMI原理揭秘之远程方法调用
  7. 区块链软件公司:区块链使用程序如何成为战胜商场应战的垫脚石
  8. No relevant classes found. No output generated、metaObject连接错误
  9. MySQL - Found option without preceding group in config file
  10. 怎么在Windows 11中为音频输出选择扬声器
  11. Makefile之自动生成依赖(8)
  12. OpenGL基础39:GLSL内建变量与接口块
  13. springcloud与jdk版本问题
  14. HDU 3333-Turing Tree(BIT好题)
  15. 诛仙3饮马江南服务器信息,横刀云渺,饮马天河----浅谈云渺天河5S单刷
  16. hdu1864--dp
  17. JavaMail概述
  18. 手机模拟器安装证书抓包
  19. python的交互式是什么,python交互是什么
  20. 一位俄罗斯程序员移民美国的故事

热门文章

  1. Bottleneck Layer层
  2. kettle提示:ArrayIndexOutOfBoundsException
  3. 盘点期货外汇程序化交易课程(持续更新)
  4. 操作系统(试题汇总)
  5. 程序员是不是真的经常在生活中被绿呢?
  6. SQLSTATE[HY000]: General error: xxxx Prepared statement needs to be re-prepared
  7. 语音识别基础(一):语音是什么
  8. 【方法指南】将以逗号为分隔值的文件转换为excel格式文件
  9. 动画:链表快慢指针解题技巧
  10. java计算机毕业设计志愿者服务平台源码+数据库+系统+lw文档