时月oe 2022-11-25 23:53 采纳率: 44.4%
浏览 94
已结题

QT音乐播放获取时长

最近在学习QT遇到了一个问题:
需求是获取一个文件夹下所有的音乐并展示出来,但是在处理音乐时长时出了问题

我是用的QMediaPlayer来播放音乐,此时我已经获取到了文件夹下所有的音乐,通过使用player->setMedia()设置音乐,然后触发了metaDataAvailableChanged()信号,从而获取音乐的时长

这种方法在获取单个音频的时长的时候是可以的,但是如果是在批量处理的情况下,只能获取到最后一个文件的时长,前面的都获取不到,通过调试发现,metaDataAvailableChanged信号只被触发了一次。

也就是说,我通过循环来触发metaDataAvailableChanged信号,结果只能触发一次,我觉得可能是槽函数优先级的问题,必须得槽函数执行完成之后,内部的信号才能发送出去,请问这种情况应该如何解决呢?

这里是我的代码


```c++
void MusicList::initConnect()
{
    connect(this->player, &QMediaPlayer::metaDataAvailableChanged, this, [=](bool available) {    //用来处理player媒体改变的相应
        if (available) {
            this->music.duration = player->duration();
            music_list->replace(music_list->size() - 1, this->music);
        }
        });
    connect(this->add_folder_button, &QPushButton::clicked, this, &MusicList::addFolder);        //添加文件夹
}

void MusicList::packMusic(QString file)
{
    QFileInfo info(file);
    music.name = info.baseName();
    music.path = info.filePath();
    music.suffix = info.suffix();        //封装music信息
    music_list->append(music);
    this->player->setMedia(QUrl::fromLocalFile(file));          //修改媒体
}

void MusicList::addFolder()
{
    QString path = QFileDialog::getExistingDirectory(this,tr("打开文件夹"),"/",QFileDialog::ShowDirsOnly);
    if(path == nullptr){
        qDebug() << "用户未选择文件夹";
        return;
    }
    //寻找路径下所有音乐文件
   QDir dir(path);
   QStringList filter;
   filter << "*.mp3";         //获取所有mp3格式的文件
   QStringList result = dir.entryList(filter,QDir::Files | QDir::Readable);

   //对音乐文件进行查重
   for(auto it = result.begin();it != result.end();it++){
       QString current_path = path + "/" +  *it;         //获取当前文件夹下音频文件的完整路径
       bool flag = false;
       for(auto i = this->music_list->begin();i != this->music_list->end();i++){
           if(current_path == i->path){        //发现重复
               flag  = true;
               break;
           }
       }
       if(!flag){      //未发现重复歌曲,插入到music_list中
           packMusic(current_path);              //
       }else{
           //do nothing
       }
   }
}

```

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月3日
    • 创建了问题 11月25日

    悬赏问题

    • ¥15 c++ gmssl sm2验签demo
    • ¥15 关于模的完全剩余系(关键词-数学方法)
    • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
    • ¥15 关于移动机器人坐标计算
    • ¥30 模拟电路 logisim
    • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
    • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
    • ¥15 安装quartus II18.1时弹出此error,怎么解决?
    • ¥15 keil官网下载psn序列号在哪
    • ¥15 想用adb命令做一个通话软件,播放录音