作者: 使徒保罗

邮箱:297329588szh@163.com

声明: 欢迎交流学习,如有任何疑问,请通过邮箱联系本人

环境: win10 64位+qt5.7(MINGW)

参考:[微软还回录音文档](https://msdn.microsoft.com/en-us/library/dd316551%28v=vs.85%29.aspx)

功能: qt调用The Windows Audio Session API (WASAPI) 采集声卡示例代码

最低系统要求: 客户端Windows Vista,服务器Windows Server 2008,手机Windows Phone 8

pro文件内容:

QT += core
QT -= gui
CONFIG += c++11
TARGET = WindowsCoreAduioDemo
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L$$PWD/lib/ -lOle32

main.cpp文件内容:

#include <QCoreApplication>
#include <Windows.h>
#include <MMDeviceAPI.h>
#include <AudioClient.h> //WSAPI
#include <AudioPolicy.h> //WSAPI
#define MAX_AUDIO_FRAME_SIZE 192000
#define SAFE_RELEASE(punk) \
            if((NULL != punk)) \
            { (punk)->Release(); (punk)=NULL; }
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    IAudioClient *      _AudioClient = NULL;
    IAudioCaptureClient *_CaptureClient = NULL;
    IMMDevice * _Device = NULL;
    IMMDeviceEnumerator * _DeviceEnumerator = NULL;
    HANDLE _AudioSamplesReadyEvent = NULL;
    WAVEFORMATEX *      _MixFormat = NULL;
    BYTE *pBuffer = NULL;
    //初始化Com库
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if(hr != S_OK)
    {
        printf("初始化Com库失败\n");
        return -1;
    }
    //创建Com对象IMMDeviceEnumerator
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&_DeviceEnumerator));
    if (FAILED(hr))
    {
       printf("Unable to retrieve CoCreateInstance %x\n", (long)hr);
       return false;
    }
    //获取声音播放设备对象IMMDevice
    hr = _DeviceEnumerator->GetDefaultAudioEndpoint(eRender,eMultimedia,&_Device);
    if (FAILED(hr))
    {
       printf("Unable to retrieve device %x\n", hr);
       return false;
    }
    //释放IMMDeviceEnumerator对象
    SAFE_RELEASE(_DeviceEnumerator)
    //在音频数据拷贝之前要添加一个引用,
    _Device->AddRef();
    //创建Com对象IAudioClient
   hr = _Device->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, NULL, reinterpret_cast<void **>(&_AudioClient));
   if (FAILED(hr))
   {
       printf("Unable to activate audio client: %x.\n", hr);
       return false;
   }
   //获取音频引擎内如共享模式程序的音频流格式
   hr = _AudioClient->GetMixFormat(&_MixFormat);
   if (FAILED(hr))
   {
       printf("Unable to get mix format on audio client: %x.\n", hr);
       return false;
   }
   //wBitsPerSample是采样深度(位深)  nChannels是音频通道数 _FrameSize一个采样的大小(字节)
   size_t _FrameSize = (_MixFormat->wBitsPerSample / 8) * _MixFormat->nChannels;
   //初始化音频引擎
   /*
    *AUDCLNT_SHAREMODE_SHARED只用共享模式才能在还回(loopback)模式下起作用
    *AUDCLNT_STREAMFLAGS_EVENTCALLBACK允许设置事件通知回调 SetEventHandle才会有效果
    *AUDCLNT_STREAMFLAGS_LOOPBACK设置音频为还回模式,
    *这样WSAAPI客户端就能捕获渲染断点设备播放的音频流
    */
   hr = _AudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK|AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 0, 0, _MixFormat, NULL);
   if (FAILED(hr))
   {
       printf("Unable to initialize audio client: %x.\n", hr);
       return false;
   }
   _AudioSamplesReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
   if (_AudioSamplesReadyEvent == NULL)
   {
       printf("Unable to create samples ready event: %d.\n", GetLastError());
       return false;
   }
   //设置事件通知对象
   hr = _AudioClient->SetEventHandle(_AudioSamplesReadyEvent);
   if (FAILED(hr))
   {
       printf("Unable to set ready event: %x.\n", hr);
       return false;
   }
   //生成采集服务
   hr = _AudioClient->GetService(IID_PPV_ARGS(&_CaptureClient));
   if (FAILED(hr))
   {
       printf("Unable to get new capture client: %x.\n", hr);
       return false;
   }
   //开始采集
   hr = _AudioClient->Start();
   if (FAILED(hr))
   {
       printf("Unable to get new capture client: %x.\n", hr);
       return false;
   }
   pBuffer=new BYTE[MAX_AUDIO_FRAME_SIZE];
   while (TRUE)
   {
       DWORD waitResult = WaitForSingleObject(_AudioSamplesReadyEvent, INFINITE);
       BYTE *pData = NULL;
       INT nBufferLenght = 0;
       UINT32 framesAvailable = 0;
       DWORD  flags = 0;
       hr = _CaptureClient->GetBuffer(&pData, &framesAvailable, &flags, NULL, NULL);
       if (SUCCEEDED(hr))
       {
           if (framesAvailable!=0)
           {
               if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
               {
                   //告诉Copy Data写静音
                   pData = NULL;
               }
               else
               {                  
                   //Copy data from the audio engine buffer to the output buffer.
                   int nDataLen = framesAvailable*_FrameSize;
                   CopyMemory(pBuffer,pData,nDataLen);
                   printf("get capture audio len: %d!\n", nDataLen);
               }
           }          
       }
       _CaptureClient->ReleaseBuffer(framesAvailable);
   }
   delete[] pBuffer;
   SAFE_RELEASE(_DeviceEnumerator)
   SAFE_RELEASE(_Device)
   SAFE_RELEASE(_DeviceEnumerator)
   SAFE_RELEASE(_DeviceEnumerator)
   SAFE_RELEASE(_DeviceEnumerator)
   CoUninitialize();
   return a.exec();
}

windows音频声卡采集相关推荐

  1. WebRTC Native M96 SDK接口封装--enableLoopbackRecording启用声卡采集,声卡播放的声音合到本地音频流发送远端

    音频采集或播放时,需要用MMDevice API来枚举和获取指定设备,用WASAPI来处理应用程序和音频设备之间的音频流数据,如采集或播放 声网接口:enableLoopbackRecording 接 ...

  2. windows 音频编程

    windows 音频编程主要有三种方式: 1.MCI,这种方式很简单,但是不够灵活  2.waveXXXX等低阶的声音API  3.DirectSound 编写一个功能较强大的音频处理程序,那就必须使 ...

  3. 音频服务器没运行,windows音频服务未运行没声音无法启动windows audio服务

    windows音频服务未运行没声音无法启动windows audio服务 发布时间:2014-06-17 11:18:31   作者:佚名   我要评论 电脑出现了音频服务未运行,而且没声音.提示wi ...

  4. Windows音频编程:Win32 Wave API 的使用

    //Windows音频编程:Win32 Wave API 的使用 //下面是一个Win32控制台程序的源码,环境VS2008,新建一个空的Win32控制台项目,加入此文件编译即可,功能为录制5秒并回放 ...

  5. Windows音频录制软件哪个好

    Windows音频录制软件哪个好 音频录制软件不说每天都会使用到,但是一定是不可缺少的一项功能,不仅仅是在日常的工作中,包括网上学习教程都会使用到录音,但是很多在网上学习教程的人会问,怎么直接录制啊! ...

  6. Windows10电脑音频出现故障:必须运行 Windows 音频服务和 Windows 音频终结点生成器服务,音频才能正常工作。至少其中一个服务未运行

    一.原因 本人在进行腾讯会议时遇到卡顿,便用任务管理器强制关闭了该应用,随即音频设备便不能使用. 查看Windows服务中的Windows Audio也是停止启动的状态,甚至没有办法启动. 随机检查音 ...

  7. Android多个音频源采集,Android音频开发之音频采集的实现示例

    在 Android 系统中,一般使用 AudioRecord 或者 MediaRecord 来采集音频. AudioRecord 是一个比较偏底层的API,它可以获取到一帧帧 PCM 数据,之后可以对 ...

  8. 瑞昱Realtek(Realtek HD Audio Driver)音频声卡驱动R2.49 for Win7_Vista

    不管是在高端系列主板上,还是在低端系列主板上,我们都能看到Realtek瑞昱的身影,Realtek HD Audio Driver能够支持所有的Realtek HD Audio音频驱动.Realtek ...

  9. windows 播放声音 c语言,Windows 音频播放方法

    音频播放是一个游戏不可或缺的部分,优质的音乐和特效可以把游戏的质量整体上升一个层次.播放声音的方法很多,Windows 本身就支持简单的声音播放,但是如果想要更高级的特效,就需要专门的音效引擎了.教程 ...

最新文章

  1. 应用系统怎么开启审计功能_vivo开启Android新版本系统公测,功能丰富令人惊喜...
  2. java 兔子生仔问题
  3. 谁将引领新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  4. Qt打开文件对话框同时选中多个文件或单个文件
  5. [html] 举例说明使用data-有什么优点?
  6. Call for Papers | ACCV 2022在澳门等你
  7. 华为已经升级鸿蒙系统的机型,鸿蒙系统名单已确认!覆盖55款机型,这些手机将被淘汰!...
  8. idea 注释模板_常用的模板函数
  9. led数字字体_技术丨体育场馆LED显示屏设计与安装要求
  10. 固态硬盘玩游戏有必要吗
  11. 测试TCP和UDP端口的方法
  12. hadoop 文件上传
  13. 原理图设计及仿真流程
  14. 玩客云实名认证安全吗_玩客云骗局揭秘(真的可以月入万元?)
  15. 我的世界服务器怎么无限刷红石,我的世界无限红石怎么做 无限红石BUG攻略
  16. 2021年中国家具制造业经营现状分析:营业收入达8004.6亿元,利润总额达433.7亿元[图]
  17. Unity VR:如何修改fbx动画
  18. Postgresql的Listen-Notify机制
  19. 这件事有了新进展 | 经济学人20210529期下载
  20. 从前端Vue/Axios到后端交互--浅谈Vue生命周期、Ajax调用

热门文章

  1. VRRP 虚拟路由器冗余协议
  2. 高中计算机课总结300字,网课总结作文300字
  3. 使用eclipse运行JSP时出现了“HTTP状态 500 - 内部服务器错误”
  4. 今天买了一本雅思英语,个人感觉编的很好,好久没有遇到好书了。自己坚持,英文资料才是王道
  5. JAVA游戏资讯网站计算机毕业设计Mybatis+系统+数据库+调试部署
  6. 在基层当正职好,还是到上一级当副职好?傻瓜才说提级好,高手都分析这几个方面...
  7. 【重铸Java根基】理解Java反射机制
  8. 小表妹想学鸿蒙(HarmonyOS)开发板,于是我翻出了所有的鸿蒙开发板,靠,全给我抢走了,简直是野蛮表妹!
  9. 【批处理/batch】切换谷歌DNS脚本
  10. C++讲义——第一节C++基础