【问题标题】:QMediaPlayer crashes when pausing playback暂停播放时 QMediaPlayer 崩溃
【发布时间】:2017-03-02 08:30:28
【问题描述】:

我有一个较长的 wav 文件,我想在其中播放较小的部分。 我将 startTime 和 endTime 存储为 qint64 并且已经加载了音频文件:

player = new QMediaPlayer;
connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(slotTick(qint64)));

player->setNotifyInterval(10);
player->setMedia(QUrl::fromLocalFile(mediasource));
...
player->setPosition(startTime);
player->play();

我使用 positionChanged 信号观察位置,并使用以下插槽,在达到所需部分的结尾时停止播放:

void PlayerWidget::slotTick(qint64 time){
if(endTime >= 0 && time >= endTime){
    if(player->state() == QMediaPlayer::PlayingState){
        player->stop();
    }
}

不幸的是,程序在播放器停止后不久就崩溃了。可能是什么原因

【问题讨论】:

  • 是否有任何错误信息?你还有其他线索吗?
  • 我有同样的问题(使用 PyQt5.7)。使用连接到 positionChanged 的​​ slotTick 暂停时出现访问冲突。如果我暂停或停止,它会崩溃。非常相似的代码在 Phonon 上运行良好。

标签: c++ qt qmediaplayer


【解决方案1】:

刚遇到同样的问题,虽然我并不真正知道根本原因,但我设法以某种方式直觉地找到了一个真正有效的解决方案。

不要直接调用player->stop(),而是使用singleShot QTimer 触发它。 Python 代码等效:QtCore.QTimer.singleShot(0, player.stop)

【讨论】:

  • 这可能与 Qt 在这种情况下不可重入有关。我最近遇到了这样的事情,试图从重载的QAbstractVideoSurface::present() 回调中调用QMediaPlayer::pause()。使用QTimer::singleShot(0, &mediaPlayer, &QMediaPlayer::pause) 解决了我的问题!谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
相关资源
最近更新 更多