【问题标题】:Officially sanctioned way to play back audio from resource under Qt5.x官方认可的从 Qt5.x 下的资源播放音频的方式
【发布时间】:2014-07-06 03:08:33
【问题描述】:

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

经过一番研究,我找到了一些替代方案:

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

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

QMediaPlayer - 依靠原生后端在不同平台上播放所有支持的格式。不支持从资源播放。有些人提倡在使用之前将资源存储到临时文件的解决方案。我觉得这样的骇客充其量是令人厌恶的。

声子 - 不再受到官方支持。

【问题讨论】:

    标签: audio qt5 embedded-resource playback


    【解决方案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 文件。为简洁起见:您还想知道什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多