IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Sujet d'étude : intégration d'une vidéo à une IHM


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Sujet d'étude : intégration d'une vidéo à une IHM
    Bonjour à tous !

    Voilà j'explique un peu mon souci, je suis actuellement étudiant et dans le cadre d'un projet, on me demande de réussir à créer via Qt une interface IHM capable de récupérer la vidéo d'une IP Camera et de la stream en direct sur l'IHM. Mon souci : je suis en dernière année d'ingénierie mécanique... autant vous dire que le développement et moi .... ça fait 36 !

    Qu'à cela ne tienne, j'ai commencé en faisant plusieurs tuto, et j'ai réussi à créer l'IHM permettant d'utiliser quelques boutons. Le souci intervient pour la partie vidéo, je n'ai absolument aucune idée de comment partir et/ou comment fragmenter cette partie de projet, et malgré de recherche je n'ai pas trouvé de tuto me permettant d'y arriver. Voilà quand même ma vision de ce que je dois effectuer, vous me direz rapidement si je suis dans le faux ou non :
    - Etablir la connexion avec la source envoyant la vidéo
    - Savoir récupérer un flux d'information via Qt
    - Ouvrir ce flux sous format H.264

    Je me répète encore je suis totalement novice en développement, j'essaye de m'intéresser à la doc Qt mais j'ai beaucoup de mal à y avancer et malgré mes recherche je ne trouve rien sur le "streaming" vidéo.

    Voilà ! Merci beaucoup d'avance

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    J'update ma situation, j'ai essayé d'intégrer Gstreamer et voilà ce que j'ai pu avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <iostream>
    #include <QCoreApplication>
    #include <QGlib/Error>
    #include <QGlib/Connect>
    #include <QGst/Init>
    #include <QGst/Bus>
    #include <QGst/Pipeline>
    #include <QGst/Parse>
    #include <QGst/Message>
    #include <QGst/Utils/ApplicationSink>
    #include <QGst/Utils/ApplicationSource>
     
     
    class MySink : public QGst::Utils::ApplicationSink
    {
    public:
        MySink(QGst::Utils::ApplicationSource *src)
            : QGst::Utils::ApplicationSink(), m_src(src) {}
    protected:
        virtual void eos()
        {
            m_src->endOfStream();
        }
        virtual QGst::FlowReturn newSample()
        {
            QGst::SamplePtr sample = pullSample();
            m_src->pushBuffer(sample->buffer());
            return QGst::FlowOk;
        }
    private:
        QGst::Utils::ApplicationSource *m_src;
    };
    class Player : public QCoreApplication
    {
    public:
        Player(int argc, char **argv);
        ~Player();
    private:
        void onBusMessage(const QGst::MessagePtr & message);
    private:
        QGst::Utils::ApplicationSource m_src;
        MySink m_sink;
        QGst::PipelinePtr pipeline1;
        QGst::PipelinePtr pipeline2;
    };
    Player::Player(int argc, char **argv)
        : QCoreApplication(argc, argv), m_sink(&m_src)
    {
        QGst::init(&argc, &argv);
        if (argc <= 1) {
            std::cerr << "Usage: " << argv[0] << " <audio_file>" << std::endl;
            std::exit(1);
        }
        const char *caps = "audio/x-raw, format=(string)S16LE, channels=(int)1,"
                           " rate=(int)44100, layout=(string)interleaved";
        /* source pipeline */
        QString pipe1Descr = QString("filesrc location=rtsp://admin:pwd@169.254.162.xx/axis-media/media.amp\"%1\" ! "
                                     "decodebin ! "
                                     "audioconvert ! "
                                     "audioresample ! "
                                     "appsink name=\"mysink\" caps=\"%2\"").arg(argv[1], caps);
        pipeline1 = QGst::Parse::launch(pipe1Descr).dynamicCast<QGst::Pipeline>();
        m_sink.setElement(pipeline1->getElementByName("mysink"));
        QGlib::connect(pipeline1->bus(), "message::error", this, &Player::onBusMessage);
        pipeline1->bus()->addSignalWatch();
        /* sink pipeline */
        QString pipe2Descr = QString("appsrc name=\"mysrc\" caps=\"%1\" is-live=true format=3 ! "
                                     "autoaudiosink").arg(caps);
        pipeline2 = QGst::Parse::launch(pipe2Descr).dynamicCast<QGst::Pipeline>();
        m_src.setElement(pipeline2->getElementByName("mysrc"));
        QGlib::connect(pipeline2->bus(), "message", this, &Player::onBusMessage);
        pipeline2->bus()->addSignalWatch();
        /* start playing */
        pipeline1->setState(QGst::StatePlaying);
        pipeline2->setState(QGst::StatePlaying);
    }
    Player::~Player()
    {
        pipeline1->setState(QGst::StateNull);
        pipeline2->setState(QGst::StateNull);
    }
    void Player::onBusMessage(const QGst::MessagePtr & message)
    {
        switch (message->type()) {
        case QGst::MessageEos:
            quit();
            break;
        case QGst::MessageError:
            qCritical() << message.staticCast<QGst::ErrorMessage>()->error();
            break;
        default:
            break;
        }
    }
    int main(int argc, char **argv)
    {
        Player p(argc, argv);
        return p.exec();
    }
    Mais mes erreur sont toutes concernant QtGst :
    /Bureau/Qt Clement/QtGsttest/player.cpp:16: erreur : undefined reference to QGst::Ui::VideoWidget::VideoWidget(QWidget*, QFlags<Qt::WindowType>)' /Bureau/Qt Clement/QtGsttest/player.cpp:16: erreur : undefined reference toQGst::Ui::VideoWidget::~VideoWidget()'
    /Bureau/Qt Clement/build-QtGsttest-Desktop-Debug/player.o:-1: In function Player::~Player()': /Bureau/Qt Clement/QtGsttest/player.cpp:25: erreur : undefined reference toQGst::Element::setState(QGst::State)'

    etc...

    j'ai la même chose pour chaque ligne intégrant "QGst::..."

    à l'aide svp

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut


    Qu'as-tu modifié dans ton fichier .pro ? Il faut aussi inclure les fichiers .lib/.a de QGst (https://doc.qt.io/qt-5/qmake-project...ther-libraries). Maintenant, le QGst que j'ai trouvé n'est plus maintenu… Sinon, tu as https://doc.qt.io/qt-5/videooverview.html.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Merci Dourouc de la réponse ! Normalement j'ai bien tout inclus dans mon .pro
    Code qt-pro : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    QT       += core gui
     
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
     
    TARGET = testQtNetwork
    TEMPLATE = app
     
     
    SOURCES += main.cpp\
            mafenetre.cpp \
     
    HEADERS  += mafenetre.h \
     
     
    QT += network
    QT += widgets
     
    CONFIG += pkgconfig
     
     
     
     
     
    INCLUDEPATH += "/usr/include/Qt5GStreamer"


    Qu'est ce que ça voudrait dire pour moi que ce n'est plus maintenu ?

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut
    Citation Envoyé par Clemschan Voir le message
    Normalement j'ai bien tout inclus dans mon .pro
    Justement, non : tu ne fais rien avec la variables LIBS.

    Citation Envoyé par Clemschan Voir le message
    Qu'est ce que ça voudrait dire pour moi que ce n'est plus maintenu ?
    Que ça pourrait ne plus fonctionner avec une version "future" de Qt (à partir de 2014), principalement. Si tu as un problème quelconque qui doit être corrigé dans la bibliothèque, il n'y aura personne pour le résoudre à ta place.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Arf ... je suis un nooby en Qt et en dev orienté objet, qu'arait-il fallu que je fasse dans mon .pro pour être bon ?

    Ah ! Du coup tu me conseille de partir sur une version plus ancienne de Qt ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Ok je suis désolé je viens de voir la suite de la première ligne >< j'étais sur mon portable et je n'ai pas pensé à scroll vers la droite, je vais essayer d'include les lib et je redis si ça marche (Encore désolé du message pour rien ^)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Bon je reviens au sujet des Glib du coup, j'avoue que malgré les exemple que j'ai pu voir sur le net je suis un peu perdu. J'ai un dossier Glib dans mon repertoire Qt5Gstreamer, j'aurais endance à vouloir utiliser celles qui sont à l'intérieur mais ma "commande n'est pas reconnue" ...

    Mettons que dans ce dossier je veuille utiliser une lib qui s'appelle error.h, je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIBS += /usr/include/Qt5GStreamer/Glib/ -error
    On est d'accord là dessus ?

  9. #9
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut
    Citation Envoyé par Clemschan Voir le message
    On est d'accord là dessus ?
    Nope .

    Une bibliothèque externe, c'est exactement comme ton code : des fichiers d'en-tête (.h) et des fichiers de code (.cpp). Certaines bibliothèques n'ont que des fichiers d'en-tête, c'est notamment le cas d'une bonne partie de Boost : dans ce cas, tu inclus le fichier d'en-tête (#include), ça marche, fini journée. Par contre, s'il faut du code à compiler (l'immense majorité des bibliothèques), c'est-à-dire si le fichier .h ne contient pas tout, il faut dire au compilateur où se trouve le code. Pour éviter de recompiler trente-six mille fois le code des bibliothèques, tu ne dis pas au compilateur où se trouvent les fichiers CPP : tu dis que tu vas utiliser une bibliothèque externe (DLL sous Windows), décrite dans un format approprié pour le compilateur (fichiers de liaison : .lib pour Visual C++, .a pour MinGW/GCC). Pour éviter une prolifération des DLL, tu peux y mettre plusieurs fichiers d'implémentation (tout comme ton exécutable se compose de plusieurs fichiers).

    Plus en pratique : le module Qt Widgets. Tu as une série de classes avec des fichiers d'en-tête et de code : QWidget, QPaintDevice, etc. L'implémentation de toutes ces classes se trouve dans Qt5Widgets.dll. Le compilateur, de son côté, a besoin d'une spécification des classes (les fichiers d'en-tête) et d'une liste des fonctions disponibles dans cette DLL (.lib/.a). Jusqu'à présent, tu as indiqué le chemin des fichiers d'en-tête, pas des fichiers de liaison : c'est à ça que sert l'option LIBS.

    Ensuite, pour la syntaxe, on va rester sur du Linux (je suppose que c'est ce que tu utilises). Avec -L, tu spécifies un dossier où les fichiers .a se situent ; avec -l, tu dis au compilateur (éditeur de liens, en fait, pour être précis) quel fichier il faut utiliser (-liberty pour libiberty.a, par exemple).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup pour toutes ces réponses ! L'explication était très claire !
    Bon du coup j'ai essayé de regarder sur la documentation Qt et Gstreamer mais je n'ai pas vu à quelles librairies il faut que je fasse appel. Donc comment est-ce que je peux savoir ce dont j'ai besoin et donc ce qu'il faut que je mette dans mon .pro ?

  11. #11
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut
    Apparemment, il y a des solutions plus simples, mais je n'ai jamais testé quelque chose de similaire : https://gstreamer.freedesktop.org/da...tegration.html
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Ah niice, je ne sais pas comment il a pu m'échapper ce site là >< désolé... Merci beaucoup !

    Bon je vais essayer de continuer en ce sens, tous mes Gst fonctionnent mais mon programme n'affiche rien, je crois que je n'ai que l'audio et pas la vidéo ><

    Starting /home/Bureau/Qt Clement/build-solomain-Desktop-Debug/solomain...
    Usage: /home/Bureau/Qt Clement/build-solomain-Desktop-Debug/solomain <audio_file>
    /home/Bureau/Qt Clement/build-solomain-Desktop-Debug/solomain exited with code 1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création ou Intégration d'une galerie vidéo dans mon site web
    Par [ced] dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 08/02/2010, 22h04
  2. Intégration d'une vidéo Flash via Dreamweaver CS4
    Par Winch44 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 10/12/2008, 16h52
  3. [GTK+] Capture vidéo avec OpenCV et intégration dans une GUI GTK+
    Par kurapix dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 21/04/2008, 10h12
  4. Intégration d'une vidéo dans un .swf
    Par kronos85 dans le forum Flash
    Réponses: 1
    Dernier message: 18/02/2008, 11h06
  5. [VB ou C++] intégration d'une page web dans une application
    Par devmat dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/10/2005, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo