【问题标题】:QMediaPlayer app not responding when play many times in a short durationQMediaPlayer 应用程序在短时间内播放多次时无响应
【发布时间】:2015-09-10 07:20:23
【问题描述】:

我创建了一个默认的Qt GUI应用程序,我在主窗口类中添加了void keyPressEvent(QKeyEvent* ev);,当用户按下空格时,应用程序会播放声音(ok)但是当用户在短时间内多次按下时,应用程序不会回应。我不知道为什么?请帮帮我!

.pro 文件:

QT       += core gui multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = untitled2
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

RESOURCES += \
    res.qrc

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>

namespace Ui { class MainWindow; }

class MainWindow : public QMainWindow {
  Q_OBJECT
public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();
  void keyPressEvent(QKeyEvent* ev);
private:
  Ui::MainWindow *ui;
  QMediaPlayer mp;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{ ui->setupUi(this); }

MainWindow::~MainWindow() { delete ui; }

void MainWindow::keyPressEvent(QKeyEvent* ev) {
  switch(ev->key()) {
  case Qt::Key_Space: {
    mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));
    mp.play();
    break;
  }
  }
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MainWindow w;
  w.show();
  return a.exec();
}

(注意:这里我确实上传了mainwindow.ui.res.qrc)

【问题讨论】:

    标签: c++ qt qmediaplayer


    【解决方案1】:

    mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));

    不要不必要地设置媒体,因为媒体播放器不会在内部检查“哦,媒体是一样的,我要聪明点”

    您希望在再次按下它的键时从头开始启动媒体。最简单的解决方案是使用一个布尔值来指示是否设置了媒体。

      case Qt::Key_Space: 
      {
        if(!is_media_set)
        {
            mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));
            is_media_set = true;
        }
        mp.setPosition(0);
        mp.play();
        break;
      }
    

    如果多个按键触发不同的声音,则将布尔值替换为 current_media_key 以指示最后加载的媒体。

    【讨论】:

    • 答案是mp.setPosition(0);
    【解决方案2】:

    对于 setMedia,文档说:

    将此属性设置为 null QMediaContent 将导致播放器 丢弃与当前媒体源相关的所有信息,并 停止与该媒体相关的所有 I/O 操作。

    每次再次按空格键时,媒体文件都必须从磁盘加载,最好在构造函数或初始化方法中加载一次,以节省加载时间(访问硬盘是总是很慢)

    要再次运行声音,请在调用 play() 之前添加 setPosition(0)

    【讨论】:

    • 如果在构造函数中设置媒体或某些相同的地方,声音一开始只会播放一次。我不知道为什么。
    • 如果在“play()”之前调用“setPosition(0)”,问题是否仍然存在?
    • 多次设置setMedia会导致无响应。 -> 只设置一次
    • 如果不加setPosition(0),只是有些第一次能听到声音,加上setPosition(0),应用运行正常
    • mp.state() 为 PlayingState 时按空格键会播放声音,而 mp.state() 为 StoppedState 时则没有声音
    【解决方案3】:

    我不确定这是最好的答案,但这是我的最终结果:

    void MainWindow::keyPressEvent(QKeyEvent* ev) {
      switch(ev->key()) {
      case Qt::Key_Space: {
        qDebug() << mp.mediaStatus() << mp.state();
        if(mp.state() == QMediaPlayer::StoppedState) {
          mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));
        }
        mp.setPosition(0);
        mp.play();
        break;
      }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多