2

我正在开发一种视频播放器,但在实现“播放”功能时遇到问题,其中帧以特定时间间隔显示。

使用按钮或滑块跳过帧可以正常工作,但以下代码不能。此外,它似乎阻塞了 GUI 线程并且只显示最后一帧。

void Player::play()
{
    for(int i = currentFrame_; i < replay_->getHeader().numberOfFrames; ++i)
    {
        setFrame(i);    // load and send frame i
        msleep(33);     // wait 33 ms
    }
}

void Player::setFrame(int frameNumber)
{
    currentFrame_ = frameNumber;
    replay_->setCurrentFrame(currentFrame_);    // load currentFrame into buffer
    updateFrame();                              // send it to the GUI to be shown
}

void Player::updateFrame()
{
    ReplayFrame colorFrame;

    colorFrame = replay_->getColorFrame();
    emit colorFrameEvent(static_cast<unsigned char *>(colorFrame.getData()));    // this is connected to MainWindow::showFrame(unsigned char *)
}

请注意,以下代码可以正常工作:

// In main window, called upon loading a replay
QObject::connect(ui->sliderFrames, SIGNAL(valueChanged(int)), kp, SLOT(setFrame(int)));

所以移动滑块实际上确实会显示相应的帧。

4

1 回答 1

0

好吧,这当然正在发生……你在 GUI 线程上处于一个紧密的循环中,在循环结束之前永远不会控制消息泵!:-)

之后可能会在您的小部件上同步调用某种更新功能updateFrame(),并且您可以观看播放...但是 GUI 仍然会冻结您可能想要按下的按钮(例如“暂停”)

考虑改用计时器,以便 GUI 线程可以在帧之间运行消息泵:

http://doc.qt.digia.com/qt/qtimer.html

于 2012-12-04T20:43:20.673 回答