Qt 延迟而不冻结多媒体

Qt 延迟而不冻结多媒体,qt,Qt,所以我想让它播放一段时间的视频,所以就在play()之后我使用函数delay(): 但它冻结了流,所以我只得到音频,没有图像。??? 我不能用定时器 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QVideoWidget *videoWidget = new QVideoWidget;

所以我想让它播放一段时间的视频,所以就在
play()之后我使用函数
delay():
但它冻结了流,所以我只得到音频,没有图像。???
我不能用定时器

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QVideoWidget *videoWidget = new QVideoWidget;
    QBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(videoWidget);
    ui->centralWidget->setLayout(layout);
    p.setVideoOutput(videoWidget);
    filename=QFileDialog::getOpenFileName(this,"select movie","/");
    this->setWindowTitle(filename);
    p.setMedia(QUrl::fromLocalFile(filename));
    p.setPosition(300000);
    p.play();

    delay(4000);
    p.setPosition(p.position()+1800000);
    delay(4000);
    p.setPosition(p.position()+1800000);
    delay(4000);
}
void MainWindow:: delay( int millisecondsToWait )
{
    QEventLoop loop;
     QTimer::singleShot( millisecondsToWait, &loop, SLOT(quit()));
     loop.exec();
}

它将毫不延迟地正常运行视频,但我希望它每30分钟仅播放4秒,我只获得音频

我认为你的方法没有第一眼看到的那么好,因为它本质上是忙等待。您最多为processEvents提供100毫秒。这意味着,如果没有或只有几个事件需要处理,它将返回得更早。这意味着,大量的CPU时间花费在循环中。在任何情况下,线程都不会空闲

现在看看如何使用QTimer。QTimer不会像您这样忙着等待,相反,线程将暂停,直到被操作系统唤醒。QTimer的保证粒度是10ms,因此在您的示例中,它应该足够好了。这里我假设
millissecondstowait
明显大于100,即您允许processEvents花费的时间

因此,您的问题的可能解决方案是将对
delay()
的调用替换为
QTimer::singleShot()
,如下示例所述:


现在
delay()
之后出现的代码(继续下一个循环)将在用于计时器的slot方法中执行。通过使进程异步,您允许Qt和操作系统在播放视频时将CPU花费在需要的地方。

我认为您的方法没有乍一看的好,因为它本质上是忙等待。您最多为processEvents提供100毫秒。这意味着,如果没有或只有几个事件需要处理,它将返回得更早。这意味着,大量的CPU时间花费在循环中。在任何情况下,线程都不会空闲

现在看看如何使用QTimer。QTimer不会像您这样忙着等待,相反,线程将暂停,直到被操作系统唤醒。QTimer的保证粒度是10ms,因此在您的示例中,它应该足够好了。这里我假设
millissecondstowait
明显大于100,即您允许processEvents花费的时间

因此,您的问题的可能解决方案是将对
delay()
的调用替换为
QTimer::singleShot()
,如下示例所述:


现在
delay()
之后出现的代码(继续下一个循环)将在用于计时器的slot方法中执行。通过使进程异步,您允许Qt和操作系统在播放视频时将CPU花费在需要的地方。

如果您希望在不中断事件循环的情况下执行逐步逻辑,您可以使用下一种模式:

void delay( int msec )
{
  QEventLoop loop;
  QTimer::singleShot( msec, &loop, &QEventLoop::quit );
  loop.exec();
}

如果希望在不中断事件循环的情况下执行逐步逻辑,可以使用下一种模式:

void delay( int msec )
{
  QEventLoop loop;
  QTimer::singleShot( msec, &loop, &QEventLoop::quit );
  loop.exec();
}

我这样做了,但仍然没有播放任何图像,只是声音没有屏幕我这样做了,但仍然没有播放任何图像,只是声音没有屏幕,然后问题是在其他地方。如果您需要帮助,请提供SSCCE。然后问题就出在其他地方。如果您需要帮助,请提供SSCCE。为什么您不想使用
QTimer
+插槽来实现这种逻辑?不能使用带插槽的计时器,它在循环中不工作,我在循环中使用此代码为什么您不想使用
QTimer
+插槽来实现这种逻辑?不能使用带插槽的计时器,它在循环中不工作,我在循环中使用此代码