fano
14-11-2018, 10:21
Ho un problema che mi sta davvero facendo impazzire... ho una telecamera tipo "video sorveglianza" che mi invia via HTTP uno stream mjpeg che qualsiasi browser del mondo sa leggere semplicemente aprendo la pagina, ma ovviamente QWebkit no! Il meglio che ho ottenuto è che lo stampasse come testo :D
La cosa più ovvia visto che sto "browser" a stento supporta HTML4 era di usare un plugin, ma Flash no perché la gente ha paura di lui (?), così avevo pensato al plugin di VLC, ma tutto quello che ho ottenuto era un cubetto con un bel '?' dentro!
Ora sto provando a fare il mio plugin ed ero tutto contento perché questo funziona pure: http://doc.qt.io/archives/qt-4.8/qt-webkit-simplewebplugin-example.html!
Così ho pensato di usare QMediaplayer, ma sembra la solita cosa non finita... come plugin va addirittura in SIGABORT (!), l'applicazione standalone mi mostrava uno schermo nero :eek:
I codec credo di averceli ho messo gstreamer-ffmpeg che dovrebbe supportare qualunque cosa, ma nulla!
Come ultimo tentativo ho deciso di farlo "a mano", in fondo uno stream MJPEG è piuttosto semplice da gestire sono tante JPEG una dietro l'altra e infatti l'applicazione standalone funziona!
Così stamane mi appropinquo a trasformarla in un plugin e... NON appare nulla!
Peggio ancora il segnale readyRead di QNetworkReply manco avviene!
Questo è il plugin factory, molto simile all'esempio di fatto:
QObject *mediaPlayerFactory::create(const QString &mimeType, const QUrl &url,
const QStringList &argumentNames,
const QStringList &argumentValues) const
{
if (mimeType != "video/mjpeg")
return 0;
mediaPlayerView *view = new mediaPlayerView(url);
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), view, SLOT(onReadyRead(reply)));
connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),
view,SLOT(onError(QNetworkReply::NetworkError)));
//connect(reply, SIGNAL(finished()), reply, SLOT(deleteLater()));
return view;
}
E questo è il costruttore di mediaPlayerView:
mediaPlayerView::mediaPlayerView(const QUrl &url, QWidget *parent)
: QWidget(parent)
{
this->url = url;
Log("Getting MJPEG stream from url: " + url.toString());
label = new QLabel(this);
label->setWindowFlags(label->windowFlags() | Qt::FramelessWindowHint);
label->show();
Log("Ready to stream!");
}
onReadyRead() è relativamente banale legge tutto il pacchetto vede se è un'immagine completa e lo disegna... sono sicuro al 100% che se venisse chiamato funzionerebbe pure!
Ho settato ovviamente che i plugin siano abilitati e che possano accedere alla rete:
QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled,
true);
QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, true);
Qualche idea?
Il prossimo tentativo sarebbe qualcosa di davvero troppo anche per Linux: far partire VLC frameless ed embeddare la sua finestra dentro la pagina web :muro: :muro: :muro:
La cosa più ovvia visto che sto "browser" a stento supporta HTML4 era di usare un plugin, ma Flash no perché la gente ha paura di lui (?), così avevo pensato al plugin di VLC, ma tutto quello che ho ottenuto era un cubetto con un bel '?' dentro!
Ora sto provando a fare il mio plugin ed ero tutto contento perché questo funziona pure: http://doc.qt.io/archives/qt-4.8/qt-webkit-simplewebplugin-example.html!
Così ho pensato di usare QMediaplayer, ma sembra la solita cosa non finita... come plugin va addirittura in SIGABORT (!), l'applicazione standalone mi mostrava uno schermo nero :eek:
I codec credo di averceli ho messo gstreamer-ffmpeg che dovrebbe supportare qualunque cosa, ma nulla!
Come ultimo tentativo ho deciso di farlo "a mano", in fondo uno stream MJPEG è piuttosto semplice da gestire sono tante JPEG una dietro l'altra e infatti l'applicazione standalone funziona!
Così stamane mi appropinquo a trasformarla in un plugin e... NON appare nulla!
Peggio ancora il segnale readyRead di QNetworkReply manco avviene!
Questo è il plugin factory, molto simile all'esempio di fatto:
QObject *mediaPlayerFactory::create(const QString &mimeType, const QUrl &url,
const QStringList &argumentNames,
const QStringList &argumentValues) const
{
if (mimeType != "video/mjpeg")
return 0;
mediaPlayerView *view = new mediaPlayerView(url);
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), view, SLOT(onReadyRead(reply)));
connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),
view,SLOT(onError(QNetworkReply::NetworkError)));
//connect(reply, SIGNAL(finished()), reply, SLOT(deleteLater()));
return view;
}
E questo è il costruttore di mediaPlayerView:
mediaPlayerView::mediaPlayerView(const QUrl &url, QWidget *parent)
: QWidget(parent)
{
this->url = url;
Log("Getting MJPEG stream from url: " + url.toString());
label = new QLabel(this);
label->setWindowFlags(label->windowFlags() | Qt::FramelessWindowHint);
label->show();
Log("Ready to stream!");
}
onReadyRead() è relativamente banale legge tutto il pacchetto vede se è un'immagine completa e lo disegna... sono sicuro al 100% che se venisse chiamato funzionerebbe pure!
Ho settato ovviamente che i plugin siano abilitati e che possano accedere alla rete:
QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled,
true);
QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, true);
Qualche idea?
Il prossimo tentativo sarebbe qualcosa di davvero troppo anche per Linux: far partire VLC frameless ed embeddare la sua finestra dentro la pagina web :muro: :muro: :muro: