内容简介:这几年一直在折腾一个网络+实时音频相关的项目,因为对实时性的要求太高了,所以一直在想各种办法去优化。最近优化到了音频播放的层面,了解到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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。