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
+插槽来实现这种逻辑?不能使用带插槽的计时器,它在循环中不工作,我在循环中使用此代码