From 7b977c1cdb659d907f42c99a2bc6054586c8a532 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Thu, 13 Jun 2024 22:17:08 -0700 Subject: [PATCH 1/7] feat: add method for playing videos via Qt --- webview/ScreenlyWebview.pro | 2 +- webview/src/mainwindow.cpp | 14 +++++++++++++- webview/src/mainwindow.h | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/webview/ScreenlyWebview.pro b/webview/ScreenlyWebview.pro index 370d748f8..5cf974be6 100644 --- a/webview/ScreenlyWebview.pro +++ b/webview/ScreenlyWebview.pro @@ -1,6 +1,6 @@ TEMPLATE = app -QT += webengine webenginewidgets dbus +QT += webengine webenginewidgets dbus multimediawidgets CONFIG += c++11 SOURCES += src/main.cpp \ diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index 17c109b3f..bd8757693 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -1,10 +1,11 @@ #include #include +#include +#include #include "mainwindow.h" #include "view.h" - MainWindow::MainWindow() : QMainWindow() { QWebEngineSettings::globalSettings() -> setAttribute(QWebEngineSettings::LocalStorageEnabled, true); @@ -25,3 +26,14 @@ void MainWindow:: loadImage(const QString &uri) { view -> loadImage(uri); } + +void MainWindow::loadVideo(const QString &uri) +{ + qDebug() << "Type: Image, URI: " << uri; + + QMediaPlayer *player = new QMediaPlayer; + QVideoWidget *videoWidget = new QVideoWidget; + player -> setVideoOutput(videoWidget); + player -> setMedia(QUrl(uri)); + player -> play(); +} diff --git a/webview/src/mainwindow.h b/webview/src/mainwindow.h index b972b5e9d..b3d70255d 100644 --- a/webview/src/mainwindow.h +++ b/webview/src/mainwindow.h @@ -15,6 +15,7 @@ class MainWindow : public QMainWindow public slots: void loadPage(const QString &uri); void loadImage(const QString &uri); + void loadVideo(const QString &uri); private: View *view; From a802e30603849fc2287d1ada3bac556498663b53 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Tue, 25 Jun 2024 11:22:31 -0700 Subject: [PATCH 2/7] fix: convert QMediaPlayer and QVideoWidget objects to instance variables. --- webview/src/mainwindow.cpp | 16 ++++++++-------- webview/src/mainwindow.h | 4 ++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index bd8757693..4cf03a453 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -1,7 +1,5 @@ #include #include -#include -#include #include "mainwindow.h" #include "view.h" @@ -15,6 +13,11 @@ MainWindow::MainWindow() : QMainWindow() view = new View(this); setCentralWidget(view); + + player = new QMediaPlayer; + videoWidget = new QVideoWidget; + + player->setVideoOutput(videoWidget); } void MainWindow::loadPage(const QString &uri) @@ -29,11 +32,8 @@ void MainWindow:: loadImage(const QString &uri) void MainWindow::loadVideo(const QString &uri) { - qDebug() << "Type: Image, URI: " << uri; + qDebug() << "Type: Video, URI: " << uri; - QMediaPlayer *player = new QMediaPlayer; - QVideoWidget *videoWidget = new QVideoWidget; - player -> setVideoOutput(videoWidget); - player -> setMedia(QUrl(uri)); - player -> play(); + player->setMedia(QUrl(uri)); + player->play(); } diff --git a/webview/src/mainwindow.h b/webview/src/mainwindow.h index b3d70255d..83a8530b4 100644 --- a/webview/src/mainwindow.h +++ b/webview/src/mainwindow.h @@ -2,6 +2,8 @@ #include #include +#include +#include #include "view.h" @@ -19,4 +21,6 @@ class MainWindow : public QMainWindow private: View *view; + QMediaPlayer *player; + QVideoWidget *videoWidget; }; From 18862fb1fafe11c0c684fa67116b69ec9646f3e5 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 26 Jun 2024 14:21:41 -0700 Subject: [PATCH 3/7] chore: remoe unnecessary code and imports --- webview/ScreenlyWebview.pro | 2 +- webview/src/mainwindow.cpp | 5 +---- webview/src/mainwindow.h | 2 -- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/webview/ScreenlyWebview.pro b/webview/ScreenlyWebview.pro index 5cf974be6..2ef31a13e 100644 --- a/webview/ScreenlyWebview.pro +++ b/webview/ScreenlyWebview.pro @@ -1,6 +1,6 @@ TEMPLATE = app -QT += webengine webenginewidgets dbus multimediawidgets +QT += webengine webenginewidgets dbus multimedia CONFIG += c++11 SOURCES += src/main.cpp \ diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index 4cf03a453..1905abbff 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -15,9 +15,6 @@ MainWindow::MainWindow() : QMainWindow() setCentralWidget(view); player = new QMediaPlayer; - videoWidget = new QVideoWidget; - - player->setVideoOutput(videoWidget); } void MainWindow::loadPage(const QString &uri) @@ -34,6 +31,6 @@ void MainWindow::loadVideo(const QString &uri) { qDebug() << "Type: Video, URI: " << uri; - player->setMedia(QUrl(uri)); + player->setMedia(QUrl::fromLocalFile(uri)); player->play(); } diff --git a/webview/src/mainwindow.h b/webview/src/mainwindow.h index 83a8530b4..102fb260d 100644 --- a/webview/src/mainwindow.h +++ b/webview/src/mainwindow.h @@ -2,7 +2,6 @@ #include #include -#include #include #include "view.h" @@ -22,5 +21,4 @@ class MainWindow : public QMainWindow private: View *view; QMediaPlayer *player; - QVideoWidget *videoWidget; }; From 75943cf17f42c91d411302b1c236c89ed2f87e0a Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Thu, 27 Jun 2024 10:57:58 -0700 Subject: [PATCH 4/7] fix: use timers and boolean checkers to determine if the player's ready to play videos or not --- webview/src/mainwindow.cpp | 29 +++++++++++++++++++++++++---- webview/src/mainwindow.h | 4 +++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index 1905abbff..436471015 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "mainwindow.h" @@ -27,10 +28,30 @@ void MainWindow:: loadImage(const QString &uri) view -> loadImage(uri); } -void MainWindow::loadVideo(const QString &uri) +void MainWindow::loadVideo(const QString &uri, unsigned int durationInSecs) { - qDebug() << "Type: Video, URI: " << uri; + qDebug() << "Type: Video, URI: " << uri << ", Duration: " << durationInSecs << "s"; + + if (ready) + { + ready = false; + player->setMedia(QUrl::fromLocalFile(uri)); + player->play(); + + // Convert duration from seconds to milliseconds. + unsigned int additionalDurationInMs = 500; // This prevents the video for being stopped too early. + unsigned int durationInMs = durationInSecs * 1000 + additionalDurationInMs; + + // @TODO: Use the state() method instead to check if the video is still playing. + // At the moment, state() returns QMediaPlayer::StoppedState even if the video is still playing. + QTimer::singleShot(durationInMs, this, [=](){ + player->stop(); + ready = true; + }); + } +} - player->setMedia(QUrl::fromLocalFile(uri)); - player->play(); +bool MainWindow::isReady() +{ + return ready; } diff --git a/webview/src/mainwindow.h b/webview/src/mainwindow.h index 102fb260d..b61dc0e5e 100644 --- a/webview/src/mainwindow.h +++ b/webview/src/mainwindow.h @@ -16,9 +16,11 @@ class MainWindow : public QMainWindow public slots: void loadPage(const QString &uri); void loadImage(const QString &uri); - void loadVideo(const QString &uri); + void loadVideo(const QString &uri, unsigned int durationInSecs); + bool isReady(); private: View *view; QMediaPlayer *player; + bool ready = true; }; From 571f012433fd48515a4a7ba3f46165d6cb9a6da3 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 24 Jul 2024 03:02:27 +0000 Subject: [PATCH 5/7] fix: make use of a video widget to fix video playback --- webview/Dockerfile | 24 ++++++++++++++++-------- webview/ScreenlyWebview.pro | 2 +- webview/src/mainwindow.cpp | 5 ++++- webview/src/mainwindow.h | 2 ++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/webview/Dockerfile b/webview/Dockerfile index cc89d5a81..458588efd 100644 --- a/webview/Dockerfile +++ b/webview/Dockerfile @@ -8,11 +8,6 @@ RUN apt-get update && \ apt-utils \ firebird-dev \ freetds-dev \ - gstreamer1.0-tools \ - gstreamer1.0-plugins-base \ - gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-ugly \ - gstreamer1.0-x \ libasound2-dev \ libavcodec-dev \ libavformat-dev \ @@ -31,8 +26,6 @@ RUN apt-get update && \ libgles2-mesa-dev \ libglib2.0-dev \ libgst-dev \ - libgstreamer-plugins-base1.0-dev \ - libgstreamer1.0-dev \ libicu-dev \ libinput-dev \ libiodbc2-dev \ @@ -96,7 +89,22 @@ RUN apt-get update && \ nodejs \ ruby \ va-driver-all \ - wget + wget \ + libgstreamer1.0-dev \ + libgstreamer-plugins-base1.0-dev \ + libgstreamer-plugins-bad1.0-dev \ + gstreamer1.0-plugins-base \ + gstreamer1.0-plugins-good \ + gstreamer1.0-plugins-bad \ + gstreamer1.0-plugins-ugly \ + gstreamer1.0-libav \ + gstreamer1.0-tools \ + gstreamer1.0-x \ + gstreamer1.0-alsa \ + gstreamer1.0-gl \ + gstreamer1.0-gtk3 \ + gstreamer1.0-qt5 \ + gstreamer1.0-pulseaudio # Really make sure we don't have this package installed # as it will break the build of QTWebEngine diff --git a/webview/ScreenlyWebview.pro b/webview/ScreenlyWebview.pro index 2ef31a13e..b33d83817 100644 --- a/webview/ScreenlyWebview.pro +++ b/webview/ScreenlyWebview.pro @@ -1,6 +1,6 @@ TEMPLATE = app -QT += webengine webenginewidgets dbus multimedia +QT += webengine webenginewidgets dbus multimedia multimediawidgets CONFIG += c++11 SOURCES += src/main.cpp \ diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index 436471015..7fdfd1172 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -15,7 +15,9 @@ MainWindow::MainWindow() : QMainWindow() view = new View(this); setCentralWidget(view); - player = new QMediaPlayer; + player = new QMediaPlayer(this, QMediaPlayer::Flags(QMediaPlayer::VideoSurface)); + videoWidget = new QVideoWidget; + player->setVideoOutput(videoWidget); } void MainWindow::loadPage(const QString &uri) @@ -36,6 +38,7 @@ void MainWindow::loadVideo(const QString &uri, unsigned int durationInSecs) { ready = false; player->setMedia(QUrl::fromLocalFile(uri)); + this->setCentralWidget(videoWidget); player->play(); // Convert duration from seconds to milliseconds. diff --git a/webview/src/mainwindow.h b/webview/src/mainwindow.h index b61dc0e5e..3d318e271 100644 --- a/webview/src/mainwindow.h +++ b/webview/src/mainwindow.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "view.h" @@ -22,5 +23,6 @@ class MainWindow : public QMainWindow private: View *view; QMediaPlayer *player; + QVideoWidget *videoWidget; bool ready = true; }; From d3a2c9a6341ef598a82660081fd7e4b22554a6dd Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Tue, 1 Oct 2024 16:13:26 +0000 Subject: [PATCH 6/7] fix: viewer crashes when switching between video and non-video assets --- webview/src/mainwindow.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index 1120d4ff1..95b526143 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -35,11 +35,15 @@ void MainWindow::loadVideo(const QString &uri, unsigned int durationInSecs) { ready = false; player->setMedia(QUrl::fromLocalFile(uri)); - this->setCentralWidget(videoWidget); + + view->hide(); + videoWidget->setFullScreen(true); + videoWidget->show(); + player->play(); // Convert duration from seconds to milliseconds. - unsigned int additionalDurationInMs = 500; // This prevents the video for being stopped too early. + unsigned int additionalDurationInMs = 1000; // This prevents the video for being stopped too early. unsigned int durationInMs = durationInSecs * 1000 + additionalDurationInMs; // @TODO: Use the state() method instead to check if the video is still playing. @@ -47,6 +51,9 @@ void MainWindow::loadVideo(const QString &uri, unsigned int durationInSecs) QTimer::singleShot(durationInMs, this, [=](){ player->stop(); ready = true; + + videoWidget->hide(); + view->show(); }); } } From 662cac56c7938ed39e593d407046c9fffb635b39 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Tue, 1 Oct 2024 17:12:10 +0000 Subject: [PATCH 7/7] fix: previous non-video asset showing for split second after video playback --- webview/src/mainwindow.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/webview/src/mainwindow.cpp b/webview/src/mainwindow.cpp index 95b526143..c0b5d3600 100644 --- a/webview/src/mainwindow.cpp +++ b/webview/src/mainwindow.cpp @@ -36,6 +36,14 @@ void MainWindow::loadVideo(const QString &uri, unsigned int durationInSecs) ready = false; player->setMedia(QUrl::fromLocalFile(uri)); + // Show a blank screen for a second before playing the video. + // This is to prevent the non-video content from being displayed for a short time + // after the video has finished playing. + view->loadImage("null"); + QEventLoop loop; + QTimer::singleShot(1000, &loop, SLOT(quit())); + loop.exec(); + view->hide(); videoWidget->setFullScreen(true); videoWidget->show();