剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. 编程之美
  3. 正文

PortAudio捕获输出音频

2015年7月15日 2649点热度 3人点赞 0条评论

记得前面说到使用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。这个代码确实可以捕获输出音频。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2015年7月15日

Jeff

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

打赏 点赞
< 上一篇
下一篇 >

文章评论

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

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

版权声明

为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

最近评论
ztt 发布于 3 周前(04月05日) 你好,想看里面的视频和图片为什么没有显示呢?需要下flash吗还是什么。
huowa222 发布于 1 个月前(03月26日) 同问
邱国禄 发布于 2 个月前(02月17日) Receive Delta以0.25ms为单位,reference time以64ms为单位,kDe...
啊非 发布于 4 个月前(12月30日) 大神,请教一个问题: constexpr int kBaseScaleFactor = Tran...
啊非 发布于 4 个月前(12月30日) reference time:3字节,表示参考时间,以64ms为单位,但是 代码里面是 Trans...
相关文章
  • Google ProtoBuf协议介绍
  • Intel Media SDK 内存优化(转)
  • 网络字节转换到本地字节的函数模板
  • 解决Ubuntu下vlc无法播放文件
  • MFC WebBrowser控件如何实现滚动条滑动

COPYRIGHT © 2024 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang