RtAudio与QT
这几年一直在折腾一个网络+实时音频相关的项目,因为对实时性的要求太高了,所以一直在想各种办法去优化。最近优化到了音频播放的层面,了解到RtAudio这个实时音频库,决定用它来替代QT中对网络音频流的播放。
毕竟是开源项目,打开官网,拿到例子,就开始往上怼呗。最初当然是要初始化一下,所以直接 COPY 代码就上
RtAudio adc;if ( adc.getDeviceCount() < 1 ) {std::cout << "\nNo audio devices found!\n";exit( 1 );}
我了个乖乖,之前QT GUI项目啥也没配置,就 include 一下头文件,居然编译成功。好事啊!
一运行,程序一个照面都没打,就退出了,但是应用程序输出框里什么都没有,也不知道怎么回事。
分析与解决
于是,决定先编译运行一下 RtAudio 自己的例子。先建立一个 QT 控制台程序,然后把 RtAudio 里的 test/playsaw.cpp 内容拷到主文件,编译,运行,还是马上退出了。不过,幸运的是,命令行留下了两行字:
RtApiDummy: This class provides no functionality.No audio devices found!
至此,我才想起来,原来在 QT 的 GUI 应用中,std::out 的内容并不会出现在 QT Creator 调试界面的“应用程序输出”窗口中。果然,把 std::out 改为 qDebug() 之后,就可以看到错误提示了。
那么,上面的 RtApiDummy 又是什么鬼呢?查找文档之后,才明白这是因为没有指定 Api,于是修改代码:
int main()
{RtAudio dac(RtAudio::Api::WINDOWS_DS);
// RtAudio dac;
很简单,就是用给 RtAudio 类的实例构造函数一个对应用的Api,WINDOWS_DS 的意思是指使用 DIRECT SOUND 作为语音接口。其他可选的还的 WINDOWS_ASIO 和 WINDOWS_WASAPI,在此略过不述。
然后再编译,就会出现堆 ERROR 了,
RtAudio.obj:-1: error: LNK2019: unresolved external symbol __imp__GetDesktopWindow@0 referenced in function "private: virtual bool __thiscall RtApiDs::probeDeviceOpen(unsigned int,enum RtApi::StreamMode,unsigned int,unsigned int,unsigned int,unsigned long,unsigned int *,struct RtAudio::StreamOptions *)" (?probeDeviceOpen@RtApiDs@@EAE_NIW4StreamMode@RtApi@@IIIKPAIPAUStreamOptions@RtAudio@@@Z)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol __imp__CoUninitialize@0 referenced in function "public: virtual __thiscall RtApiDs::~RtApiDs(void)" (??1RtApiDs@@UAE@XZ)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol __imp__CoInitialize@4 referenced in function "public: __thiscall RtApiDs::RtApiDs(void)" (??0RtApiDs@@QAE@XZ)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundCreate@12 referenced in function "public: virtual struct RtAudio::DeviceInfo __thiscall RtApiDs::getDeviceInfo(unsigned int)" (?getDeviceInfo@RtApiDs@@UAE?AUDeviceInfo@RtAudio@@I@Z)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundEnumerateW@8 referenced in function "public: virtual unsigned int __thiscall RtApiDs::getDeviceCount(void)" (?getDeviceCount@RtApiDs@@UAEIXZ)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundCaptureCreate@12 referenced in function "public: virtual struct RtAudio::DeviceInfo __thiscall RtApiDs::getDeviceInfo(unsigned int)" (?getDeviceInfo@RtApiDs@@UAE?AUDeviceInfo@RtAudio@@I@Z)
RtAudio.obj:-1: error: LNK2019: unresolved external symbol _DirectSoundCaptureEnumerateW@8 referenced in function "public: virtual unsigned int __thiscall RtApiDs::getDeviceCount(void)" (?getDeviceCount@RtApiDs@@UAEIXZ)
还好,这个我有点老经验,GetDesktopWindow、CoUninitialize、CoInitialize、DirectSoundCreate这几个API很熟悉啊,error: LNK2019: unresolved external symbol 那肯定是一些库没有链接上去啊。通过慢慢 Google 各个函数分别属于哪个 lib,然后给项目的 .pro 文件加上这么一行:
LIBS += -ldsound -luser32 -lole32
把dsound.lib user32.lib ole32.lib 链接进去,就顺利编译通过了。运行,可以听到音箱发出声音,控制台也会输出:
Playing ... press <enter> to quit.
至此,问题就解决了。
尾声
最后,把修改 RaAudio 实例构造和增加 lib 链接的这两个修改应用到之前的 GUI 程序中,也顺利解决问题。
附,版本号:
VC2013
RtAudio 5.0
QT 5.6
RtAudio与QT相关推荐
- QT 中QTimer 和 startTimer()的区别
最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...
- QT中使用rubberband橡皮筋等方法进行选中多个物体
文章目录 功能介绍 代码介绍 myitem.h/cpp 图形项 myview.h/cpp场景 主函数 结果展示 代码下载 参考 功能介绍 点击左键.按 Shift 键可以单选,按下 Ctrl 可进行多 ...
- Electron、QT和JAVA PC桌面开发技术比较
近几年PC桌面开发越来越多的被Electron,QT和Java技术占领.下面简单比较一下它们的优劣. Electron,势是开发用时快,社区轮子多,整合一下就能用.缺点是打包大,js计算弱. Java ...
- Qt实现 指针式时钟+动态时钟 (详细注释)
先上效果图: 点击运行后首先是一个指针式时钟窗口,点击Digital Clock->可以跳转到数字时钟窗口,再点击Move Clock->可以还原为指针式时钟窗口 关于整个程序的讲解都在代 ...
- 如何保证Qt状态机的最佳性能
如何保证Qt状态机的最佳性能 How to ensure the best Qt state machine performance 如果您使用Qt进行应用程序开发,并且使用状态机,那么很可能您正在使 ...
- qt mysql now()_Qt + mysql 運用 (項目一)
自己整合了一些資料方便以后查看,另外參考了一些資料嘗試做了個學生管理系統 以下資料若有錯誤或有侵權的地方,請前輩們指正,謝謝! 在Qt項目中右鍵執行qmake,之后在運行. 另外一種方法是在MVS20 ...
- ubuntu kylin 18.04 安装 Qt Creator 5.11
首先,去官网(https://download.qt.io/official_releases/qt/ )下载Qt Creator的安装包. 我下载的是5.11.1版本文件:qt-opensource ...
- Qt msgBox 快捷版
使用 1 int iRet = msgBox(pos, tr("警告") 2 , tr("确定要删除当前选中的行吗?") 3 , tr("确定&quo ...
- c++ Qt向PHP接口POST文件流
Qt调用PHP写的接口,向其传递图片文件,并保存在服务器. 二进制文件无法直接传递,Qt采用Base64进行编码发送,PHP解码保存为文件. 注意:PHP收到数据之后会将POST过来的数据中的加号(+ ...
最新文章
- 区块链 选择交易所 五个注意点
- 如何封装Spring bean
- 【Leetcode】112. 路径总和
- Newtonsoft.json中 linq to json 和序列化哪个快?
- Robotframework中的日志级别
- js中的数组基本知识
- django 创建项目
- web——html个人简历
- 51单片机c语言轻松入门,单片机的C语言轻松入门资料
- 【CloudShell】阿里云壳EDR卸载指南
- tooth的用法_tooth的复数形式
- 如何调整图片的dpi?如何修改图片分辨率?
- Hadoop集群实验
- java中高级面试_Java中高级面试题及答案
- Java编程入门之前篇
- DODAB纳米脂质体囊泡/PANC-1细胞膜的PEG修饰的脂质体M-PEG-LIP的相关研究与制备
- ECMAScript 6 入门(阮一峰)个人总结
- 2020年PMP笔记归纳第七章项目成本管理
- [Scala基础]--Scala构建超过22个元素的class
- Excel排名函数PERCENTRANK计算逻辑
热门文章
- 易模优(E-MOU)自动编程系统,易模优最新UGNX智能电极编程系统介绍_NXopen-UG二次开发_新浪博客
- 液压、气动装置设计分析软件
- 安装debian Linux后文字显示的全是方块数字
- 成都自动化开发_西门子200smart PLC 不同类型CPU的区别
- HTML5技术实现Web图形图像处理——WebPhotoshop精简版
- HTML中注释写法 CSS中注释写法,css注释怎么写?
- java解析asn.1编码_asn1编码格式的解析过程
- Cuk电路的参数计算及仿真
- 探探引流一天加粉1000+微商引流方法讨论
- 基于STM32单片机的智能停车场车位管理系统设计