官方认可的从 Qt5.x 下的资源播放音频的方式
Posted
技术标签:
【中文标题】官方认可的从 Qt5.x 下的资源播放音频的方式【英文标题】:Officially sanctioned way to play back audio from resource under Qt5.x 【发布时间】:2014-07-06 03:08:33 【问题描述】:我想以受支持的方式从 Qt5 播放 .wav 文件。将声音作为资源存储在二进制文件中很重要。
经过一番研究,我找到了一些替代方案:
QSound - 简单的音频播放。不支持多种格式,不支持从资源播放。
QAudioOutput - 将原始音频直接流式传输到音频输出。将管理格式的任务留给您。对于许多音频文件,将它们保持为原始格式变得很麻烦。还有人错过了使用例如 mp3 压缩音频的机会。此外,还存在与播放可靠性相关的问题,因为还必须管理/优化缓冲区和其他低级原语才能获得流畅的播放。
QMediaPlayer - 依靠原生后端在不同平台上播放所有支持的格式。不支持从资源播放。有些人提倡在使用之前将资源存储到临时文件的解决方案。我觉得这样的骇客充其量是令人厌恶的。
声子 - 不再受到官方支持。
【问题讨论】:
【参考方案1】:经过大量试验和错误后,我发现 QMediaPlayer 对象的 setMedia() 方法有第二个参数,它接受一个流对象。通过使用它,我已经成功地直接从资源中播放了我的音频。
我们绕过了 QMediaPlayer 的限制,即通过手动打开资源 url 并将数据流式传输到 QMediaPlayer,它无法将资源 url 传递到本机后端。
一些代码的时间:
void MyClass::play(QString name, qreal vol)
const QString fn(":/audio/"+name+".wav");
if(0==file)
file=new QFile();
if(0!=file)
if(file->fileName()!=fn)
file->close();
file->setFileName(fn);
if(file->exists())
file->open(QIODevice::ReadOnly);
else
qDebug()<<"MyClass::play ERROR: audio file not found: "<<fn;
else
file->seek(0);
if(file->isOpen())
if(0==player)
player = new QMediaPlayer(this);
if(0!=player)
QMediaContent mc;
player->setMedia(mc,file);
player->play();
else
qDebug()<<"MyClass::play ERROR: could not create player for "<<name;
else
qDebug()<<"MyClass::play ERROR: audio file not open for "<<name;
【讨论】:
【参考方案2】:QSound::play( ":/someoptionalfolder/myfile.wav" )
适用于存储在资源中的 .wav 文件。
【讨论】:
你能再解释一下吗? 原始答案甚至无法编译并且像筛子一样泄漏,所以我想添加这个答案,该答案已记录在案并且适用于存储为资源的 .wav 文件。为简洁起见:您还想知道什么?以上是关于官方认可的从 Qt5.x 下的资源播放音频的方式的主要内容,如果未能解决你的问题,请参考以下文章
[Flutter] 音频播放插件 audioplayers 的一个路径坑