这几年一直在折腾一个网络+实时音频相关的项目,因为对实时性的要求太高了,所以一直在想各种办法去优化。最近优化到了音频播放的层面,了解到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相关推荐

  1. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

  2. QT中使用rubberband橡皮筋等方法进行选中多个物体

    文章目录 功能介绍 代码介绍 myitem.h/cpp 图形项 myview.h/cpp场景 主函数 结果展示 代码下载 参考 功能介绍 点击左键.按 Shift 键可以单选,按下 Ctrl 可进行多 ...

  3. Electron、QT和JAVA PC桌面开发技术比较

    近几年PC桌面开发越来越多的被Electron,QT和Java技术占领.下面简单比较一下它们的优劣. Electron,势是开发用时快,社区轮子多,整合一下就能用.缺点是打包大,js计算弱. Java ...

  4. Qt实现 指针式时钟+动态时钟 (详细注释)

    先上效果图: 点击运行后首先是一个指针式时钟窗口,点击Digital Clock->可以跳转到数字时钟窗口,再点击Move Clock->可以还原为指针式时钟窗口 关于整个程序的讲解都在代 ...

  5. 如何保证Qt状态机的最佳性能

    如何保证Qt状态机的最佳性能 How to ensure the best Qt state machine performance 如果您使用Qt进行应用程序开发,并且使用状态机,那么很可能您正在使 ...

  6. qt mysql now()_Qt + mysql 運用 (項目一)

    自己整合了一些資料方便以后查看,另外參考了一些資料嘗試做了個學生管理系統 以下資料若有錯誤或有侵權的地方,請前輩們指正,謝謝! 在Qt項目中右鍵執行qmake,之后在運行. 另外一種方法是在MVS20 ...

  7. ubuntu kylin 18.04 安装 Qt Creator 5.11

    首先,去官网(https://download.qt.io/official_releases/qt/ )下载Qt Creator的安装包. 我下载的是5.11.1版本文件:qt-opensource ...

  8. Qt msgBox 快捷版

    使用 1 int iRet = msgBox(pos, tr("警告") 2 , tr("确定要删除当前选中的行吗?") 3 , tr("确定&quo ...

  9. c++ Qt向PHP接口POST文件流

    Qt调用PHP写的接口,向其传递图片文件,并保存在服务器. 二进制文件无法直接传递,Qt采用Base64进行编码发送,PHP解码保存为文件. 注意:PHP收到数据之后会将POST过来的数据中的加号(+ ...

最新文章

  1. 区块链 选择交易所 五个注意点
  2. 如何封装Spring bean
  3. 【Leetcode】112. 路径总和
  4. Newtonsoft.json中 linq to json 和序列化哪个快?
  5. Robotframework中的日志级别
  6. js中的数组基本知识
  7. django 创建项目
  8. web——html个人简历
  9. 51单片机c语言轻松入门,单片机的C语言轻松入门资料
  10. 【CloudShell】阿里云壳EDR卸载指南
  11. tooth的用法_tooth的复数形式
  12. 如何调整图片的dpi?如何修改图片分辨率?
  13. Hadoop集群实验
  14. java中高级面试_Java中高级面试题及答案
  15. Java编程入门之前篇
  16. DODAB纳米脂质体囊泡/PANC-1细胞膜的PEG修饰的脂质体M-PEG-LIP的相关研究与制备
  17. ECMAScript 6 入门(阮一峰)个人总结
  18. 2020年PMP笔记归纳第七章项目成本管理
  19. [Scala基础]--Scala构建超过22个元素的class
  20. Excel排名函数PERCENTRANK计算逻辑

热门文章

  1. 易模优(E-MOU)自动编程系统,易模优最新UGNX智能电极编程系统介绍_NXopen-UG二次开发_新浪博客
  2. 液压、气动装置设计分析软件
  3. 安装debian Linux后文字显示的全是方块数字
  4. 成都自动化开发_西门子200smart PLC 不同类型CPU的区别
  5. HTML5技术实现Web图形图像处理——WebPhotoshop精简版
  6. HTML中注释写法 CSS中注释写法,css注释怎么写?
  7. java解析asn.1编码_asn1编码格式的解析过程
  8. Cuk电路的参数计算及仿真
  9. 探探引流一天加粉1000+微商引流方法讨论
  10. 基于STM32单片机的智能停车场车位管理系统设计