音频捕获
DSound音频和系统声音钩子(Hooker)实践
因工作需要,折腾了一下DSound钩子技术。在折腾之前,我也尝试在网络上搜索相关的音频HOOk技术,但搜索到的,都是要收费,而老板不愿花钱。不用收费的,也只是说”立体声混音”的使用,且与我现有项目要求相差很大,类似这样的功能,我们软件本来就有支持,但XP和Win7下都有很大问题。
没有办法,追求完美的用户体验的话,就不能偷懒,只能花大力气写一个DSound的HOOK技术了。
在分享成果之前,先说一下需求:
1.可以实现QQMusic、Kugou等专业播放器的音频截获。
2.输入任意采样率的音频数据,像32k,44k,48k等立体声或单声道声音。
3.保存成Wav文件。
需求很简单,实现很困难。首先这方面的资料非常少,也有很多人都问这方面问题,但几乎没有人知道怎样做才可行,也许有人知道,但不愿说出来,例如像YY语音就实现播放器的音频截取,只是它们不可能告诉你怎样做。
以下是我根据自已的实现过程,把它总结出来。
1.首先要了解一下DSound的播放器实现过程。把握好DSound的接口调用顺序或其之间的使用关系,这一点对初学者是非常重要的,因为Dsound内部管理的是一个环状数据缓冲区,如果不了解这些接口的调用原则的话,你根本无法获取到正确的数据或者说你获取的数据有时会出现杂音或断音,一听就知道不正常。
2.DSound中的几个核心接口有:Lock()\Unlock()\GetFormat()\GetCurrentPosition()\SetFormat()\GetCaps()这几个都比较重要,我都用到。
3.必须HOOK的DSound接口有Lock()\UnLock()\SetFormat()\Release().Lock()和UnLock()是获取数据,SetFormat是音频数据格式,Release是对象管理。特别是Release这个接口。因为在播放器中可能会存在多个不同DS对象,都各自有不同的生存周期,那为了避免音频数据互相串错的可能性,你需要在截取到音频数据时,都要保存到各自队列中,最后再合成一个音频。例如有两个DSBuffer对象A和B,它们都会调用Lock和Unlock来填充音频数据。那你需要把这两个对象的声音各自保存起来,然后在恰当的时机混合成一个立体声或单声道数据。
3.直接通过DirectSoundCreate或CoCreateInstance ().这两个对象是获取DSB对象IDirectSoundBuffer。
4.这时Detours库是一个比较好的API重定向开源库,我们需要用它来修改IDirectSoundBuffer中所虚函数表,也即是lpVtbl。并非需要修改所有函数,只需要修改上述3中提到的几个接口就足够了。(Detours是微软的开源库,可以去它官网下载。)
5.创建一条线程,专门处理多个DSB对象中截取到的数据,在混音前先将多个对象的数据一致化。假如我们最终要的音频数据是44.1K的立体声16位数据,则每DSB对象数据均需先转换成该类型音频数据后,才能进行混音。
在实际的测试中QQMusic和Kugou在切换歌曲时都会有那么一瞬间是同时存在两个DSB对象。因为一个正在销废,另一个正在创建。如果想偷懒,可以不考虑多个DSB对象同时存在并混音的情况。只是我在实现过程中考虑得比较复杂并且也实现了。
6.音频重采样和音频数据转换,例如:采样率为32K的32位的立体声数据转换成采样率44.1K的 16位的单声道数据。这个不是DSound捕获的范围,也比较简单,有需要的可以直接联系我,或直接谷歌或百度搜索”音频重采样算法”,这类方法网上比较多。
7.保存成Wav文件,那网上更多,我也不说了。
补充:后来集成到项目中,在原有代码上增加,进程数据同步功能及系统声音捕获功能,以下DEMO已经集成了XP和WIN7的音频捕获,包括以下几种模式:
1.只捕获麦克风,
2.仅捕获伴奏(伴奏来源分:系统声音和播放器如酷狗)
3.支持卡拉OK模式(伴奏来源分:系统声音和播放器如酷狗)。
补充:xp的系统音频捕获比较复杂,主要是立体音混音模式依赖硬件比较大,而主流的硬件就有两大类,同时还要考虑多声卡的情况(例如部份主播采用的多声卡方式,系统声卡作为声音播放,USB声卡作为麦克风采集),这样处理的算法逻辑就更复杂了。
如果有缘者,有不懂的地方,可以加Q(442559691),大家交流交流。
百度网盘:http://pan.baidu.com/s/1bnuE2Ur
效果图

hook 播放器注意事项相关推荐

  1. Android 编程案例-本地音乐播放器源码及使用注意事项

    说一下代码在用的时候注意事项以及在运行的时候可能遇到的问题: 首先代码可以在创建相应文件后直接复制,这个案例用到了RecyclerView,所以需要先添加依赖.添加下面两个: implementati ...

  2. 腾讯X5内核使用详解(X5内核播放器使用如何去除控制栏全屏播放)以及一些注意事项...

    例子下载地址 https://www.lanzous.com/i2zsv5g      GIT就不用了麻烦的不行 本人安卓刚学 就上X5内核弄了老长时间由于对maven 和idea不熟悉刚开始导包都是 ...

  3. ios手机怎么连接adb命令_手机蓝牙怎么连接汽车蓝牙放音乐,车载蓝牙播放器怎么用...

    手机蓝牙怎么连接汽车蓝牙音乐?车载蓝牙播放器怎么用?针对这两个问题,我们为大家分享下操作指南,如下: 1.把手机蓝牙和车载蓝牙都打开,且处于可发现状态: 2.在手机的蓝牙界面,点击"搜索设备 ...

  4. android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码...

    Android精选源码 一个可以上拉下滑的Ui效果,觉得好看可以学学 APP登陆页面适配 一款采用MVP的的完整漫画APP源码 android实现钉钉地图效果源码 一个使用单个文字生成壁纸图片的app ...

  5. 电脑b站html加速播放,b站投稿如何提高播放速度?如何2倍速?b站播放器选择倍速快捷方式...

    在b站看视频的时,有时候我们需要调节视频的播放速度,当然,设置方式和是多种多样的,目前较为便捷的方式就是选择通过html5播放,然后直接设置html5的播放速度就可以设置视频的播放速度了,那么我们该如 ...

  6. Android复习09【内容提供者、音乐播放器(附完整工程文件)】

    2020-04-16[第9周---周四] 音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目 录 PersonCp PersonCp.java ...

  7. 大疆精灵2v+怎么连接手机_车载蓝牙播放器怎么用,手机蓝牙怎么连接车载蓝牙放音乐...

    手机蓝牙怎么连接车载蓝牙音乐?车载蓝牙播放器怎么用?针对这两个问题,我们为大家分享下操作指南,如下: 1.把手机蓝牙和车载蓝牙都打开,且处于可发现状态. 2.在手机的蓝牙界面,点击"搜索设备 ...

  8. 自编Win8风格Android音乐播放器应用源码(单机版)

    用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...

  9. 国标MPEG-PS实时流播放器开发(附例子)

    公安部制定的GBT 28181标准广泛应用于安防领域,这个标准规定了传输的视音频数据要封装成PS流格式.PS格式(原名叫MPEG-PS)在很多领域已经应用了很长一段时间,特别是在安防.广播电视.影音制 ...

最新文章

  1. 小黑小波比.点击头像直接上传的实现
  2. 第十三课:磁场中的运动电荷
  3. SQLServer中的数据类型
  4. Joint Detection and Identification Feature Learning for Person Search
  5. Python基础之:Python中的模块
  6. 分布式存储中的数据分布策略
  7. Win7下使用toad连接oracle出现can't initialize OCI -1
  8. mybatis按datetime条件查询,参数为时间戳时
  9. 自学python考哪些证书-自学Python半年的姑娘告诉我,她这半年只值8元
  10. 对象调用corePlot使用技巧及iOS内存优化之道
  11. LVS (Linux虚拟服务器)模型及算法
  12. docker stop all containers
  13. Python生成迷宫
  14. linux 建树软件,新一代建树工具IQ-Tree介绍
  15. 微信小程序笔记(一)初次接触小程序开发
  16. 【H2】绘制三角警示牌,使用turtle绘制三角警示牌,陈斌老师北京大学暑期学校Python语言基础与应用
  17. 不同的「火」在舌頭上的表現也不一樣
  18. python输出emoji表情符号 学习笔记
  19. Chapter3.1.1 python函数小示例
  20. 向右看齐Look Up

热门文章

  1. Kerloud科研二次开发无人机介绍(支持ROS和深度学习)
  2. 5种炫酷的数据可视动态图,用Python轻松实现
  3. php@unlink删除文件失败原因
  4. 子沐课堂——分析一波Python就业前景
  5. zabbix监控华为路由器
  6. 「算法时空」星球视频目录
  7. avcodec_receive_frame始终返回EAGAIN
  8. 开学季学生党好物推荐,哪款蓝牙耳机音质好又耐用?
  9. 基于Qt的仿酷狗音乐播放器设计(一)
  10. Arcgis去除黑色背景值的有效方法!!!