// every 7 seconds for (int i = 0; i <= m_player->duration(); i += 7000) { m_player->setPosition(i); // use a local event loop to wait for frame capture bool frameCaptured = false; // connect video frame capture signal connect(videoSink, &QVideoSink::videoFrameChanged, this, [&](const QVideoFrame &frame) mutable { if (!frameCaptured && frame.isValid()) { frameCaptured = true; // set to true after first capture QImage image = frame.toImage(); ui->label->setPixmap(QPixmap::fromImage(image)); if (!image.isNull()) { // save image as jpg image.save(QString::number(i) + ".jpg", "JPG"); } // disconnect signal and stop waiting disconnect(videoSink, &QVideoSink::videoFrameChanged, this, nullptr); } }); // start local event loop and wait for frame capture loop.exec(); }