How do i play a stream with QMediaPlayer

后端 未结 2 1596
孤城傲影
孤城傲影 2020-12-29 11:05

I have set up a server and video streaming so that I can connect to the stream with ffplay using the following command line:

ffplay rtmp:///path


        
相关标签:
2条回答
  • 2020-12-29 11:45

    I've just managed to play stream in QML VideoOutput with C++ QMediaPlayer using the setMedia(QUrl("http://127.0.0.1:8080"));
    The stream was created by VLC media player using the HTTP to the 8080 port. I've also succeeded in playing the stream created by VLC media player to local file by passing it to QMediaPlayer via setMedia(QMediaContent(), &localFile);.

    0 讨论(0)
  • 2020-12-29 11:50

    I found a way to make it work.

    I gave up on Qt. The guys at Qt were insistent that it should work, but were unable to produce any configuration that works. They said that it should work if you stream from VLC, but I didn't get it to work. I also tried ffmpeg, ffserver and nginx rtmp streaming. I got these things working with mplayer, ffplay, VLC and some even with Windows Media Player, but never QMediaPlayer.

    I tried to just give the URL to setMedia. I tried to make a custom QIODevice to read the stream data and give that data to QMediaPlayer which was initialized with StreamPlayback, but it just would not succeed in reading the data.

    In the end, all I needed was something to play a stream, is a QWidget and isn't GPL licensed.

    I used libVLC and vlc-qt both of which work wonderfully.

    Following these instructions was easy, but you need to remember to copy the header files from vlc-qt/windows/vlc_headers/2.2/ to vlc/sdk/include/vlc/plugins (sic). This is important, if you don't do this you might get errors during compilation. Note that these paths might be different if you have different versions of your platform doesn't match mine. Also, it might not be necessary when you read this.

    VideoTest.h

    #ifndef VIDEOTEST_H_
    #define VIDEOTEST_H_
    
    #include <QtWidgets/QMainWindow>
    #include "ui_videotest.h"
    
    class VideoTest: public QMainWindow
    {
        Q_OBJECT
    
        public:
            VideoTest(QWidget * p_parent = 0);
            ~VideoTest();
    
        public slots:
            void sourceChanged();
    
        private:
            struct Private;
            Private * d;
            Ui::VideoTestClass ui;
    };
    
    #endif
    

    videotest.cpp

    #include "videotest.h"
    
    #include <vlc-qt/Common.h>
    #include <vlc-qt/Instance.h>
    #include <vlc-qt/Media.h>
    #include <vlc-qt/MediaPlayer.h>
    #include <vlc-qt/WidgetVideo.h>
    
    struct VideoTest::Private
    {
        VlcInstance * vlcInstance;
        VlcMediaPlayer * vlcMediaPlayer;
        VlcMedia * vlcMedia;
        VlcWidgetVideo * vlcVideoWidget;
    };
    
    VideoTest::VideoTest(QWidget * p_parent)
    {
        d = new Private();
        ui.setupUi(this);
    
        d->vlcMedia = 0;
        d->vlcInstance = new VlcInstance(VlcCommon::args(), this);
        d->vlcMediaPlayer = new VlcMediaPlayer(d->vlcInstance);
        d->vlcVideoWidget = new VlcWidgetVideo(this);
    
        d->vlcMediaPlayer->setVideoWidget(d->vlcVideoWidget);
        d->vlcVideoWidget->setMediaPlayer(d->vlcMediaPlayer);
    
        ui.videoLayout->addWidget(d->vlcVideoWidget);
    
        connect(ui.playButton, SIGNAL(clicked()), d->vlcMediaPlayer, SLOT(play()));
        connect(ui.pauseButton, SIGNAL(clicked()), d->vlcMediaPlayer, SLOT(pause()));
        connect(ui.videoUrlEdit, SIGNAL(editingFinished()), this, SLOT(sourceChanged()));
    }
    
    VideoTest::~VideoTest()
    {
        delete d->vlcInstance;
        delete d->vlcMediaPlayer;
        delete d->vlcMedia;
    
        delete d;
    }
    
    VideoTest::sourceChanged()
    {
        QUrl url(ui.videoUrlEdit->test());
        if(url.isValid() == false)
        {
            return;
        }
    
        d->vlcMediaPlayer->stop();
    
        delete d->vlcMedia;
        d->vlcMedia = new VlcMedia(url.toString(), d->vlcInstance);
        d->vlcMediaPlayer->open(d->vlcMedia);
    }
    

    VideoTest.ui

    Make your own, I don't work for you :D

    Just make sure that it has pauseButton, playButton, videoUrlEdit(QLineEdit) and videoLayout where the video widget will be inserted.

    0 讨论(0)
提交回复
热议问题