2015-05-28 4 views
9

Я настроить сервер и потокового видео, так что я могу подключиться к потоку с ffplay, используя следующую командную строку:Как я играть поток с QMediaPlayer

ffplay rtmp://<IP>/path 

Можно ли использовать QMediaPlayer QMediaContent или что-то для подключения к этому потоку?

Или, может быть, любой другой поток, который я могу создать с помощью ffserver.

, используя тот же путь, что и при работе с ffplay, в "Unsupported url scheme!"

С дальнейшими экспериментами я попробовал ffserver HTTP сервер потоковой передачи, но это закончилось Qt врезаться в MFStreamer :: doRead()

По-видимому, следовало бы назвать BeginRead для MFStreamer, но это не так.

Как воспроизводить видеопотоки с помощью QMediaPlayer?

Edit: вот мой код

videotest.cpp

#include "videotest.h" 
#include <QVBoxLayout> 
#include <QVideoWidget> 
#include <qmediaplayer.h> 
#include <QMediaContent> 
#include <QNetworkAccessManager> 
#include <QNetworkReply> 

struct VideoTest::Private 
{ 
    QMediaPlayer * mediaPlayer; 
    QNetworkAccessManager * networkAccessManager; 
    QNetworkReply * reply; 
}; 

VideoTest::VideoTest(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    d = new Private; 
    d->mediaPlayer = new QMediaPlayer(this, QMediaPlayer::StreamPlayback); 
    d->networkAccessManager = new QNetworkAccessManager(this); 
    ui.setupUi(this); 

    QVideoWidget * videoWidget = new QVideoWidget(ui.centralWidget); 
    videoWidget->show(); 
    QPalette palette = videoWidget->palette(); 
    palette.setColor(QPalette::Background, QColor(0, 0, 0)); 
    videoWidget->setPalette(palette); 

    ui.videoLayout->addWidget(videoWidget); 
    d->mediaPlayer->setVideoOutput(videoWidget); 

    connect(ui.playButton, SIGNAL(clicked()), d->mediaPlayer, SLOT(play())); 
    connect(ui.pauseButton, SIGNAL(clicked()), d->mediaPlayer, SLOT(pause())); 
    connect(ui.videoUrlEdit, SIGNAL(editingFinished()), this, SLOT(sourceChanged())); 
    connect(d->mediaPlayer, SIGNAL(error()), this, SLOT(stateChanged())); 
    connect(d->mediaPlayer, SIGNAL(stateChanged), this, SLOT(stateChanged())); 
} 

VideoTest::~VideoTest() 
{ 
    delete d; 
} 

void VideoTest::sourceChanged() 
{ 
    d->reply = d->networkAccessManager->get(QNetworkRequest(ui.videoUrlEdit->text())); 
    if(d->reply) 
    { 
     connect(d->reply, SIGNAL(readyRead()), this, SLOT(networkRequestReady())); 
    } 
} 

void VideoTest::stateChanged() 
{ 
    QString text = ui.textEdit->toPlainText(); 
    text.append("\n").append(d->mediaPlayer->errorString()).append(" : ").append(d->mediaPlayer->mediaStatus()); 
    ui.textEdit->setText(text); 
} 

void VideoTest::networkRequestReady() 
{ 
    d->mediaPlayer->setMedia(QMediaContent(), d->reply); 
} 

videotest.h

#ifndef VIDEOTEST_H 
#define VIDEOTEST_H 

#include <QtWidgets/QMainWindow> 
#include "ui_videotest.h" 

class VideoTest : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    VideoTest(QWidget *parent = 0); 
    ~VideoTest(); 

public slots: 
    void sourceChanged(); 
    void stateChanged(); 
    void networkRequestReady(); 

private: 
    Ui::VideoTestClass ui; 
    struct Private; 
    Private * d; 
}; 

#endif // VIDEOTEST_H 
+0

[Это только ссылка] (http://stackoverflow.com/questions/21448027/play-a-live-video-stream-using-qt), но я думаю, что это поможет вам. –

+0

Он все еще не говорит, как подключить QMediaPlayer к потоку или какие потоки работают с QMediaPlayer. Мой поток работает с ffplay, mplayer, VLC, но не с QMediaPlayer. – 0xbaadf00d

+0

Я принял свой ответ, но если вы создадите тот, который заставляет QMediaPlayer воспроизводить поток или просто лучше на каком-то фундаментальном уровне, я изменю отметку. – 0xbaadf00d

ответ

2

Я нашел способ, чтобы заставить его работать.

Я сдался на Qt. Ребята из Qt настаивали на том, что они должны работать, но не смогли создать какую-либо конфигурацию, которая работает. Они сказали, что он должен работать, если вы переходите из VLC, но я не получил его на работу. Я также пробовал потоки ffmpeg, ffserver и nginx rtmp. Я получил эти вещи, работая с mplayer, ffplay, VLC и некоторыми даже с Windows Media Player, но никогда не QMediaPlayer.

Я попытался просто указать URL-адрес для setMedia. Я попытался сделать пользовательский QIODevice для чтения данных потока и передать эти данные в QMediaPlayer, который был инициализирован StreamPlayback, но просто не удалось бы прочитать данные.

В конце концов, все, в чем я нуждался, было чем-то, чтобы играть в поток, является QWidget и не лицензируется GPL.

Я использовал libVLC и vlc-qt оба из которых работают чудесно.

После these instructions было легко, но вы должны помнить, чтобы скопировать файлы заголовков из VLC-Qt/Windows/vlc_headers/2,2/ к VLC/SDK/включить/VLC/плагины (так в оригинале). Это важно, если вы этого не сделаете, вы можете получить ошибки во время компиляции. Обратите внимание, что эти пути могут отличаться, если разные версии вашей платформы не совпадают с моими. Кроме того, это может быть необязательно, когда вы читаете это.

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); 
} 

ВидеоТест.щ

Сделать свой собственный, я не работаю для вас: D

Просто убедитесь, что он имеет pauseButton, playButton, videoUrlEdit (QLineEdit) и videoLayout, где будет вставлен видео виджет.

Смежные вопросы