我想以支持的方式从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文件来说工作得很好。