官方批准的方式从Qt5.x下的资源播放音频



我想以支持的方式从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;
        }
    }
}

QSound::play( ":/someoptionalfolder/myfile.wav" )对于存储在资源中的.wav文件来说工作得很好。

相关内容

  • 没有找到相关文章

最新更新