Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Stream d'un camera IP à partir d'un URL

    15 mars 2019 à 14:05:43

    Bonjour,

    J'ai avancé dans un projet, et je souhaite réussir à streamer la vidéo d'une caméra IP directement sur Qt.

    Dans l'ordre voici déjà ce que j'ai :

    Mafenetre.h

    #ifndef MAFENETRE_H
    #define MAFENETRE_H
    
    #include <QtWidgets>
    
    #include <QtMultimedia>
    #include <QtMultimediaWidgets>
    
    class MaFenetre : public QWidget
    {
        Q_OBJECT
    public:
        explicit MaFenetre(QWidget *parent = 0);
        ~MaFenetre();
    
    private:
          QMediaPlaylist *playlist;
          QMediaPlayer *player;
          QVideoWidget *videoWidget;
    
    signals:
    
    public slots:
        void stateChanged(QMediaPlayer::State state);
        void metaDataChanged();
        void metaDataChanged(const QString &key, const QVariant &value);
        void error(QMediaPlayer::Error error);
    };
    
    #endif // MAFENETRE_H
    

    Mafenetre.cpp

    #include "mafenetre.h"
    #include <QGraphicsScene>
    #include <QGraphicsView>
    #include <QGraphicsVideoItem>
    #include <QDebug>
    
    MaFenetre::MaFenetre(QWidget *parent) :
        QWidget(parent)
    {
        QString fichier = QCoreApplication::applicationDirPath() + QString("/test.mpg");
        qDebug() << QUrl("rtsp://user:mdp@169.254.1xx.xx");
    
    
        player = new QMediaPlayer;
        player->setMedia(QUrl("rtsp://user:mdp@169.254.1xx.xx"));
    
       
        QVBoxLayout *layoutPrincipal = new QVBoxLayout;
        videoWidget = new QVideoWidget(this);
        layoutPrincipal->addWidget(videoWidget);
        player->setVideoOutput(videoWidget);
        setLayout(layoutPrincipal);
    
    
        setWindowTitle(QString::fromUtf8("player"));
        setFixedWidth(320);
        setFixedHeight(240);
        
    
        connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State)));
        //connect(player, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged()));
        connect(player, SIGNAL(metaDataChanged(const QString &, const QVariant &)), this, SLOT(metaDataChanged(const QString &, const QVariant &)));
        connect(player, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(error(QMediaPlayer::Error)));
    
        player->play();
    }
    
    MaFenetre::~MaFenetre()
    {
    
    }
    
    void MaFenetre::stateChanged(QMediaPlayer::State state)
    {
        qDebug() << Q_FUNC_INFO << state;
    
    }
    
    void MaFenetre::metaDataChanged()
    {
        qDebug() << player->availableMetaData();
        if (player->isMetaDataAvailable())
        {
            qDebug() << player->metaData(QMediaMetaData::Title).toString();
            qDebug() << player->metaData(QMediaMetaData::Size);
            qDebug() << player->metaData(QMediaMetaData::Duration);
            qDebug() << player->metaData(QMediaMetaData::Resolution);
        }
    }
    
    void MaFenetre::metaDataChanged(const QString &key, const QVariant &value)
    {
        // "AudioBitRate", "AudioCodec", "PixelAspectRatio", "Resolution", "VideoCodec"
        if(key == "AudioCodec")
            qDebug() << key << value;
        if(key == "VideoCodec")
            qDebug() << key << value;
        if(key == "Resolution")
            qDebug() << key << value;
    }
    
    void MaFenetre::error(QMediaPlayer::Error error)
    {
        qDebug() << Q_FUNC_INFO << player->errorString() << error;
    }
    


    et mon main :

    #include <QApplication>
    
    #include "mafenetre.h"
    
    
    
    
    
    int main(int argc, char *argv[])
    
    {
    
        QApplication app(argc, argv);
    
    
    
        MaFenetre fenetre;
    
        fenetre.show();
    
    
    
        return app.exec();
    
    }
    

    Bon du coup j'essaye de récupérer la vidéo par mon URL, (je précise que j'arrive bien à la récupérer depuis VLC donc à ce niveau là ça foncionne).

    Mais voilà les erreurs que j'obtiens :

    QUrl("rtsp://user@169.254.1xx.xx")

    void MaFenetre::stateChanged(QMediaPlayer::State) QMediaPlayer::PlayingState

    void MaFenetre::stateChanged(QMediaPlayer::State) QMediaPlayer::StoppedState

    void MaFenetre::error(QMediaPlayer::Error) "Unhandled error" QMediaPlayer::NetworkError

    Error: "Unhandled error"



    Je ne comprends pas trop bien ce qui se passe >< Si quelqu'un peut m'éclairer :D


    Merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      17 mars 2019 à 23:38:53

      Salut,

      pour t'aider j'aurai besoin de quelque réponse, tel que:

      • Quel système d'exploitation utilise-tu ?
      • si windows arrive-tu à lire ton fichier vidéo avec windows-media ?
      • Partager sur Facebook
      • Partager sur Twitter

      Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .

        18 mars 2019 à 9:56:52

        Salut !

        Je suis sur Ubuntu 18.04 ! J'arrive à lire mon flux avec vlc

        Ce weekend j'ai complètement reviré de bord avec mon code et je suis partis sur Gstreamer : donc j'update le code que j'ai fait

        #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:mdp@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();
        }
        

        Mai je n'ai que des erreurs du type :

        /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...



        -
        Edité par ClémentC1 18 mars 2019 à 9:58:27

        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2019 à 13:55:48

          Erreur de link (édition de lien), il manque la librairie "QGst" (ou la librairie contenant cette classe) dans les options du linker.
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            19 mars 2019 à 11:38:14

            Pourtant mes include sont bons, et si effectivement c'est pas le cas je ne vois pas comment savoir quelle librairies il me faut ajouter (ou "linker" ) :/
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2019 à 12:13:22

              Les includes, c'est pour la compilation, pas pour l'édition de lien.

              Lisez la documentation de votre bibliothèque pour savoir quoi mettre dans les options du linker, en fonction de la chaine de génération utilisée.

              -
              Edité par bacelar 19 mars 2019 à 17:00:12

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                19 mars 2019 à 16:18:01

                Effectivement j'ai trouvé mon souci, il fallait effectuer un portage des librairies en Qt5, les librairies changeaient de noms, maintenant ça fonctionne merci :) (du moins les fonction, le programme lui n'affiche rien malheureusement pour le moment)
                • Partager sur Facebook
                • Partager sur Twitter

                [Qt] Stream d'un camera IP à partir d'un URL

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown