RtAudio与QT

栏目: C++ · 发布时间: 5年前

内容简介:这几年一直在折腾一个网络+实时音频相关的项目,因为对实时性的要求太高了,所以一直在想各种办法去优化。最近优化到了音频播放的层面,了解到RtAudio这个实时音频库,决定用它来替代QT中对网络音频流的播放。毕竟是开源项目,打开官网,拿到例子,就开始往上怼呗。最初当然是要初始化一下,所以直接 COPY 代码就上我了个乖乖,之前QT GUI项目啥也没配置,就 include 一下头文件,居然编译成功。好事啊!

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

任正非传

任正非传

孙力科 / 浙江人民出版社 / 2017-5-2 / 39.80

编辑推荐: 超权威、超丰富、超真实的任正非传记 亲述任正非跌宕起伏、传奇精彩的一生 ◆知名财经作家孙力科,历时十年,数十次深入华为,采访华为和任正非历程中各个关键人物,几度增删,创作成此书 ◆全书展现了任正非从出生至今70多年的人生画卷,从入伍到退役进国企,从艰难创业到开拓海外市场,囊括其人生道路上各个关键点,时间跨度之长,内容之丰富,前所未有 ◆迄今为止,任正非一生......一起来看看 《任正非传》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码