QMediaPlayer:发出 positionChanged() 时声音中断

Posted

技术标签:

【中文标题】QMediaPlayer:发出 positionChanged() 时声音中断【英文标题】:QMediaPlayer: Sound interrupts when positionChanged() is emitted 【发布时间】:2015-03-18 13:08:25 【问题描述】:

我也有类似QMediaPlayer positionChanged(). Sound inteerupts on slider updating的问题

我使用 QMediayPlayer 并且每次发出信号 positionChanged() 来更新我的滑块位置并且我为滑块设置一个新值时,声音会中断片刻。

这是在构造函数中:

soundfile = new QMediaPlayer(this, QMediaPlayer::LowLatency); //soundfile is a pointer of a QMediaPlayer Object

QObject::connect(soundfile, SIGNAL(positionChanged(qint64)), this, SLOT(changedPosition(qint64)));

这是槽函数:

void Soundfile::changedPosition(qint64 p) 
    QTime time(0,0,0,0);
    time = time.addMSecs(soundfile->position());

    if(p != 0) recordSlider->setValue(p); //THIS IS THE LINE, WHERE IT INTERRUPTS
    changeRecordTime(QString::number(p));
    recordPositionLabel->setText("Aktuelle Zeit: " + time.toString());

recordSlider 是一个 QSlider。 如果我用 setValue 注释掉该行,一切正常。

有人有想法吗?

【问题讨论】:

我认为查看一些代码会有所帮助,最重要的是,我希望查看创建 QMediaPlayer 并将其与消息和插槽连接起来的代码部分 我添加了你想看的代码行。 你没有其他 Qobject::connect 涉及 soundFile 吗?特别是声音文件作为目标对象? 感谢 Marco 的帮助,user2014561 解决了这个问题。我已经用两个 QObject::connect 连接了滑块和声音文件 一个是您在代码中看到的那个。另一种是,当滑块的位置发生变化时,调用 QMediayPlayer 的 setPosition。最终陷入循环并导致中断。 不客气,如果答案有效,请不要忘记加1。 【参考方案1】:

我认为问题在于:当媒体播放器发出 SIGNAL 时,SLOT 被调用,当您在函数中使用 setValue 时,setValue 再次发出 SIGNAL,并且该过程再次发生。

为了解决这个问题,我禁用了滑块跟踪并使用 setSliderPosition 移动位置。

例子:

slider->setTracking(false);
slider->setSliderPosition(pos);

【讨论】:

非常感谢,就是这样!

以上是关于QMediaPlayer:发出 positionChanged() 时声音中断的主要内容,如果未能解决你的问题,请参考以下文章

QMediaPlayer(状态)

QMediaPlayer::position() 返回零

QMediaPlayer - 播放 youtube 音乐

QMediaPlayer - 如何从在线广播中获取元数据?

QT:将 QMediaPlayer 连接到 QProgressBar?

使用 QMediaPlayer 进行音频可视化