官方认可的从 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 下的资源播放音频的方式的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML5 中使用音频标签时如何避免主播重新播放音乐?

[Flutter] 音频播放插件 audioplayers 的一个路径坑

OpenCV中如何播放avi文件的音频

管理音频播放(摘自Android官方培训课程中文版(v0.9.5))

从视频制作音频播客的服务? [关闭]

Android音频的录制与播放