【问题标题】:QMediaPlayer::position() return zeroQMediaPlayer::position() 返回零
【发布时间】:2020-07-24 11:19:46
【问题描述】:

我试图像这样获得当前媒体的位置:

player->setNotifyInterval(500);

connect(Player::player, &QMediaPlayer::positionChanged, this, &Player::ChangedPosition);

void Player::ChangedPosition(qint64 position)
{
    Player::currentPosition = position; //qint64 variable
    //currentPosition still 0

    qDebug() << "current position: " << currentPosition;

    return;
}

我试图这样做(因为 Qt 的文档 没有说这个插槽 QMediaPlayer::setPosition

connect(Player::player, &QMediaPlayer::positionChanged, this, &QMediaPlayer::setPosition);

我有两个班级(PlaylistPlayer):

playlistmanager - Playlist 类的对象

playermanager - Player 类的对象

设置播放列表并播放:

//set current media
playlistmanager->GetCurrentPlayList()->setCurrentIndex(newIndex);
//play this media
playermanager->play();
//set current position
playermanager->SetPositionOfTrack(playermanager->GetPositionOfTrack());

在这段代码媒体播放之后,但从头开始

这里Player类的两个方法:

qint64 Player::GetPositionOfTrack()
{
    return currentPosition; //qint64 variable in class
}

void Player::SetPositionOfTrack(const qint64 position)
{
    player->setPosition(position);

    return;
}

那么,我怎样才能获得当前媒体当前位置

【问题讨论】:

  • 你能展示最小的例子来重现和源代码吗?
  • 您是否启动了播放器(例如通过play())?
  • @Scheff 当然。添加代码。
  • 尝试用playermanager-&gt;SetPositionOfTrack(qint64(1000)) 替换playermanager-&gt;SetPositionOfTrack(playermanager-&gt;GetPositionOfTrack()) ??在我看来,您正在将轨道的位置设置为自身
  • @gui3 你是对的。我正在保存媒体的位置并再次设置它。我需要它,但currentPosition = 0。我该如何解决?

标签: c++ qt qmediaplayer


【解决方案1】:

如果我创建这样的对象,需要使用this 指针:player = new QMediaPlayer(this);。错误示例:

connect(Player::player, &QMediaPlayer::positionChanged, this, &QMediaPlayer::setPosition);

正确类的构造函数:

    Player::Player()
    {
        try
        {
            player = new QMediaPlayer(this);
        }
        catch(std::bad_alloc &exp)
        {
            #ifndef Q_DEBUG
            qCritical() << "Exception caught: " << exp.std::bad_alloc::what();
            #endif
            abort();
        }
        catch(...)
        {
            #ifndef Q_DEBUG
            qCritical() << "Some exception caught";
            #endif
            abort();
        }
    
        player->setNotifyInterval(500);
        
        connect(this, &QMediaPlayer::positionChanged, this, &Player::ChangedPosition);
    
        return;
    }

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多