2015-09-05 38 views
1

,所以我希望它發揮了一定時間的視頻,所以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(); 
} 

毫不拖延地將正常運行的視頻,但我希望它發揮只有4秒每30分鐘,我只得到了音頻

+0

爲什麼你不想使用'QTimer' +插槽,用於實現這樣的邏輯? –

+0

不能使用計時器與插槽,它不工作在一個循環,我在循環中使用此代碼 –

回答

0

我覺得,因爲它看起來在第一眼看到你的方法也沒有那麼好,因爲它本質上是忙等待。您在處給出最多 100ms的processEvents。這意味着,如果沒有或只有少數事件需要處理,它將很快返回。這意味着,大量的CPU時間花在循環中。無論如何,你的線程永遠不會閒置。

現在看看使用QTimer。 QTimer不會像你正在做的那樣忙於等待,而是線程會暫停,直到OS被喚醒。 QTimer的保證粒度爲10毫秒,所以在你的例子中它應該足夠好。在這裏,我假設millisecondsToWait顯着大於100,這是您允許processEvents花費的時間。

因此,一個可能的解決問題的方法是QTimer::singleShot()更換您的來電delay()與這裏的例子說明:http://doc.qt.io/qt-4.8/qtimer.html#singleShot

,自己目前delay()後自帶的代碼(繼續下一個循環),那麼將是在您用於計時器的插槽方法中執行。通過使進程異步,您允許Qt和OS在播放視頻時將CPU花費在需要的地方。

+0

我做到了,但仍然不播放任何圖像,只是語音沒有屏幕 –

0

如果你想要做的一步一步的邏輯不會中斷事件循環,你可以使用下一個模式:

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

嘗試過,但沒有圖像,沒有屏幕只是語音 –

+0

然後問題在別的地方。如果您需要幫助,請提供SSCCE。 –

+0

有SSCCE –