工作中有个需求是关于抓取扬声器的声音, 为什么会有这个需求? 
试想我们在共享远程桌面时,如果能够把本地桌面应用程序的声音也一起发给对方,然后播放出来, 用户体验该是多么棒。
在考虑如何实现这个需求前,我们先讨论下电脑声音的三种模式:
1) render模式
该方式实际上就是播放(output)声音,常见的API如PlaySound, WaveOutXXX, DirectSound等
2) capture模式
该方式实际上就是录入(input)声音, 也就是我们通过麦克风输入声音,常见API如WaveInXXX
3)loopback模式
该方式就是我们需要实现的方式,即把扬声器里播放的声音抓取下来。
对于上面3种方式,render和capture方式应该比较好理解, 也都是系统有API直接支持的方式, loopback方式就比较奇怪了,在XP上该方式系统实际都没有正式支持, loopback的录制方式实际上也涉及到CD的版权问题。
下面是XP时代的Audio架构图, 该架构下audio的合成和压缩都是在系统内核里进行的:
在XP这种方式下,我们要抓去声卡播放的声音没有正规的方式, 一般来说只有2中: 
一种是虚拟声卡,还有一种就是Hook audio 播放相关的API (很多时候我们会发现API hook是没有办法时的全能办法 ^_^)
但是在Vista之后,微软修改了原来的媒体架构, 以COM的方式重新封装了core audio API:
可以看到原来Auido的API (waveXXX, mixerXXX和DirectSound)都依赖下层的新封装的Core Audio APIs,而且这些APi都工作在用户模式, 也就是说声音的合成是在用户模式下通过软件实现的。在Vista之后, 可以看到我们可以单独控制每个应用程序的声音了, 因为每路Audio都可以工作在不同的Audio session了。通过新的Core Audio API, 我们可以很容易的实现声卡声音的抓取, 具体可参考这里:http://msdn.microsoft.com/en-us/library/ms679146.aspx
但是很快我们又发现了另外一个问题, 在一个网络会议里面, 如果共享自己桌面的人加入了VOIP, 另外也有其他与会者也加入了VOIP, 与会者说话的声音会在共享桌面端播放出来,但是该声音和共享的应用程序的声音又被一起被抓下来后发给了原来的与会者, 这样就有回声了。
这里就涉及到抓取声卡声音时能否排除掉某个声音,可惜答案是系统WASAPI不支持这种方式。但是因为与会者VOIP的声音是我们自己播放的,所以我们有该声音样本, 理论上我们可以通过噪声消除从混音里过滤掉与会者的声音,当然这块知识太高深,需要专门的人才能做了。
 一些Audio相关的例子:http://msdn.microsoft.com/zh-cn/subscriptions/downloads/dd316764.aspx

转载于:https://www.cnblogs.com/weiym/p/3928487.html

如何抓取扬声器的声音相关推荐

  1. BB FlashBack 屏幕抓取器转换成AVI成效对比

    简介 BB Flashback 录屏软件是一款小巧玲珑的录屏编辑软件.它可以对屏幕.系统声音进行抓取并具有较强和灵活的编辑能力.作为制作MOOC的助手,希望能够对屏幕上所见即所得的内容进行获取,并转换 ...

  2. python喜马拉雅收费_python抓取喜马拉雅免费专辑

    老规矩,先上代码 import requests import os import urllib # json文件地址 json_url = "https://www.ximalaya.co ...

  3. 如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间

    如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间 如何控制Yahoo! Slurp蜘蛛的抓取频度 2009年08月13日 星期四 5:56 上周末豆瓣的阿北给我电话:最近你们雅 ...

  4. directsound抓取麦克风PCM数据封装类

    directsound抓取麦克风PCM数据封装类 网上有很多方法从麦克风读取PCM数据,不想一一举例.只是在这里发布一个我自己写的directsound的麦克风PCM数据采集类,通过它,可以很方便的利 ...

  5. python抓取数据包_python抓数据包

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 前言:数据科学越来越火了,网页是数据很大的一个来源. 最近很多人问怎么抓网页数据 ...

  6. 小米10开始抓取日志怎么关闭_除了*#*#6485#*#*,小米手机还有这些神秘暗号

    最近在小米社区(xiaomi.cn)平台,一条快速查看手机电池信息的代码,居然成了大家广泛关注和讨论的焦点,甚至很多米粉也晒出了自己的界面截图,同时关于电池使用寿命和损耗的问题也被频频提及.而除了这条 ...

  7. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...

  8. wget 整站抓取的好工具

    Wget 的使用 1)支持断点下传功能(2)同时支持FTP和HTTP下载方式(3)支持代理服务器(4)设置方便简单:5)程序小,完全免费: 命令格式: wget [参数列表] [目标软件.网页的网址] ...

  9. 汽车之家配置参数抓取

    一.开头 汽车之家配置参数抓取最难的部分是部分页面用JS生成的,导致部分文字抓取不出来.而且该网站会经常改动混淆方式,用正则表达式处理费时费力不说,而且会经常需要改动.因此选择用JS解析器来处理.为了 ...

最新文章

  1. Android4.2以后,多屏幕的支持 学习(一)
  2. Ubuntu 配置 Android 开发 环境
  3. mysql相关操作_mysql相关操作(2)
  4. JsRender (js模板引擎)
  5. cNoteReadFile_C语言读取文件内容
  6. 在架设网站服务器时,实习实习报告网站服务器架设.doc
  7. PostgreSQL高可用集群在360的落地实战
  8. java对图像的解压_java – 将图像解压缩到blobstore中
  9. java checker_java 英文单词纠正校验框架(Word Checker)
  10. python operator.itemgetter
  11. Zabbix 监控之 修改管理员用户密码
  12. 支持向量机SVM分析
  13. Stata | 初试
  14. 批处理之计划任务at和schtasks
  15. fgo服务器维护2018.123,FGO9月30日更新维护公告
  16. Linux for嵌套if的格式,Shell篇(2)-条件语句if及循环语句 for , while , unti
  17. android删除自带应用程序,安卓手机自带软件怎么卸载?无需root卸载安卓手机自带软件方法...
  18. PS青山绿水婚片处理
  19. element-ui vue-quill-editor 富文本编辑器 解决插入图片不采用base64 从服务器传图片在显示返回url
  20. 【unity 保卫星城】--- 开发笔记08(太空站篇)

热门文章

  1. ios7 状态栏与导航栏布局与ScrollView的特性分析
  2. Yammer取消了对Scala的立场
  3. 如何写出详细且易于阅读PRD?
  4. 想知道音频剪切软件有哪些吗?
  5. python基础语法8.9体验课-Python小课体验课之三:灭霸的选择
  6. HTML中的table标签与a标签
  7. 怎样自定义设置EDIUS中2D转场特效
  8. 上榜 越秀国际金融汇获选第十届“广厦奖”候选项目
  9. 改变视频剪辑的播放速度
  10. Go语言圣经 - 第8章 Goroutines 和 Channels - 8.8 示例:并发的目录遍历