2015-09-05 4 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

Я думаю, что ваш метод не так хорошо, как она выглядит в первый взгляд , потому что это по существу занят ждать. Вы даете processEvents на больше 100ms. Это означает, что, если для обработки не существует или только несколько событий, они возвращаются намного раньше. Это означает, что большая часть времени процессора расходуется через ваш цикл. В любом случае, ваша нить никогда не простаивает.

Теперь взгляните на использование QTimer. QTimer не будет делать ожидание, как вы делаете, вместо этого поток приостанавливается до тех пор, пока не разбудится ОС. Гарантированная степень детализации QTimer составляет 10 мс, поэтому в вашем примере это должно быть достаточно хорошо. Здесь я предполагаю, что millisecondsToWait значительно больше 100, время, которое вы разрешаете процессам.

Так вероятное решение вашей проблемы, чтобы заменить вызов delay() с QTimer::singleShot(), как описано на примере здесь: http://doc.qt.io/qt-4.8/qtimer.html#singleShot

код, который приходит после того, как delay() прямо сейчас (продолжить в следующем цикле) будет затем выполняется в методе слота, который вы используете вместо таймера. Выполнив процесс асинхронным, вы разрешаете Qt и ОС тратить процессор на то, где это необходимо во время воспроизведения видео.

+0

Я сделал это, но все равно не воспроизвожу никакого изображения, просто голос без экрана –

0

Если вы хотите сделать шаг за шагом логики, не прерывая цикл событий, вы можете использовать следующий шаблон:

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

попробовал, но пока нет изображения , нет экрана только голос –

+0

Тогда проблема в другом месте. Предоставьте SSCCE, если вам нужна помощь. –

+0

есть SSCCE –

Смежные вопросы