Audio 官方认可的播放Qt5.x下资源音频的方式

Audio 官方认可的播放Qt5.x下资源音频的方式,audio,qt5,embedded-resource,playback,Audio,Qt5,Embedded Resource,Playback,我想以支持的方式播放Qt5中的.wav文件。声音作为资源存储在二进制文件中是很重要的 经过一些研究,我发现了一些替代方案: QSound-简单的音频播放。不支持多种格式,不支持从资源播放 QAudioOutput-将原始音频直接流到音频输出。将管理格式的任务留给您。对于许多音频文件,将它们保持为原始格式变得很麻烦。此外,人们还错过了使用例如mp3压缩音频的机会。此外,还存在与回放可靠性相关的问题,因为还必须管理/优化缓冲区和其他低级原语以获得平滑回放 QMediaPlayer-依靠本机后端在不同

我想以支持的方式播放Qt5中的.wav文件。声音作为资源存储在二进制文件中是很重要的

经过一些研究,我发现了一些替代方案:

QSound-简单的音频播放。不支持多种格式,不支持从资源播放

QAudioOutput-将原始音频直接流到音频输出。将管理格式的任务留给您。对于许多音频文件,将它们保持为原始格式变得很麻烦。此外,人们还错过了使用例如mp3压缩音频的机会。此外,还存在与回放可靠性相关的问题,因为还必须管理/优化缓冲区和其他低级原语以获得平滑回放

QMediaPlayer-依靠本机后端在不同平台上播放所有受支持的格式。不支持从资源中播放。一些人主张在使用之前将资源存储到临时文件中的解决方案。我觉得这样的黑客行为充其量是令人厌恶的


Phonon-不再得到官方支持。

经过多次尝试和错误后,我发现QMediaPlayer对象有第二个参数,用于接受流对象的setMedia()方法。通过使用它,我成功地直接从资源中播放了我的音频

我们通过手动打开资源URL并将数据流式传输到QMediaPlayer,绕过了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;
        }
    }
}
void MyClass::play(QString名称,qreal vol){
常量QString fn(“:/audio/”+name+“.wav”);
如果(0==文件){
file=newqfile();
}
如果(0!=文件){
如果(文件->文件名()!=fn){
文件->关闭();
文件->设置文件名(fn);
如果(文件->存在()){
文件->打开(QIODevice::ReadOnly);
}
否则{
qDebug()播放();
}
否则{

qDebug()
QSound::play(:/someoptionalfolder/myfile.wav)
适用于存储在资源中的.wav文件。

您能再解释一下吗?原始答案甚至不会编译,而且会像筛子一样泄漏,所以我想添加这个答案,它是有文档记录的,适用于存储在资源中的.wav文件。为了简单起见:您还想知道什么?