JCHub

  • Home
  • Category
    • A/V
    • WebRTC
    • Beauty of Programming
    • Linux
    • Windows
    • Moments of Life
    • Campus Life
  • Reference
    • API Reference
    • Utilities
    • AV Test
    • Doc
  • Message Board
  • About
JCHub
Code as My Sword, Lost in Obsession
  1. Main page
  2. Beauty of Programming
  3. Main content

PortAudio捕获输出音频

2015年7月15日 2980hotness 3likes 0comments

记得前面说到使用PortAudio抓取声卡输出音频,通过PortAudio确实可以实现,但是我研究发现无法基于PortAudio使用Wasapi抓取计算机输出音频,PortAudio只能使用Wasapi抓取麦克风的输入音频,而不能抓取计算机播放的声音。

先说下PortAudio如何抓取声卡输出:
1)条件:不开启立体声混音。首先我们要枚举所有设备,然后获取各个设备信息,得到设备的HostApiType,代码实现如下:

C++
1
int iApiType = Pa_GetHostApiInfo(Pa_GetDeviceInfo(deviceIndex)->hostApi)->type;

在上述代码中我们传入设备Index参数获取HostApi类型,PortAudio中定义的HostApi有如下几种类型:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef enum PaHostApiTypeId
{
    paInDevelopment=0, /* use while developing support for a new host API */
    paDirectSound=1,
    paMME=2,
    paASIO=3,
    paSoundManager=4,
    paCoreAudio=5,
    paOSS=7,
    paALSA=8,
    paAL=9,
    paBeOS=10,
    paWDMKS=11,
    paJACK=12,
    paWASAPI=13,
    paAudioScienceHPI=14
} PaHostApiTypeId;

通过枚举所有设备我们获取ApiType为paWDMKS的设备,并且该设备的maxInputChannels参数不能为0,接下来在Pa_OpenStream函数传入的参数中设置该设备为目标设备即可,在回调函数中实现录音即可抓取计算机输出的音频,即Capture what we hear from the speaker.

2)开启立体声混音。同样要枚举所有设备,这次我们要获取ApiType为paWASAPI的设备,该设备的maxInputChannels参数不能为0(不开启立体声混音只有麦克风满足这两个条件),而且通过Pa_GetDeviceInfo( deviceIndex )->name获取到的设备名不能含有麦克风字样,最后按前面所说方法传入该设备Index即可抓取音频。

真正通过Wasapi 抓取音频是无所谓开不开启立体声混音的,通过Wasapi捕获音频有个条件是被捕获的设备要工作在loopback模式下,可以看下MSDN上的这篇文章:Loopback Recording。

通过Wasapi如何捕获音频,微软给出了示例代码:https://code.msdn.microsoft.com/windowsapps/Windows-Audio-Session-22dcab6b#content。由于我的系统不是win8,VS版本达不到要求,故没去编译这个示例代码。

这个链接是微软员工写的通过Wasapi捕获音频代码:http://blogs.msdn.com/b/matthew_van_eerde/archive/2014/11/05/draining-the-wasapi-capture-buffer-fully.aspx。这个代码确实可以捕获输出音频。

This article is licensed with Creative Commons Attribution-NonCommercial-No Derivatives 4.0 International License
Tag: Nothing
Last updated:2015年7月15日

Jeff

管理员——代码为剑,如痴如醉

Tip the author Like
< Last article
Next article >

Comments

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
Cancel

This site uses Akismet to reduce spam. Learn how your comment data is processed.

相关文章
  • Google ProtoBuf协议介绍
  • Intel Media SDK 内存优化(转)
  • 网络字节转换到本地字节的函数模板
  • 解决Ubuntu下vlc无法播放文件
  • MFC WebBrowser控件如何实现滚动条滑动

COPYRIGHT © 2026 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang