2015-05-28 22 views
9

mam skonfigurować serwer i strumieniowej transmisji wideo, dzięki czemu można podłączyć do strumienia z ffplay za pomocą następującego polecenia:Jak odtwarzać strumień z QMediaPlayer

ffplay rtmp://<IP>/path 

Czy jest możliwe aby użyć QMediaPlayer QMediaContent lub coś, co łączy się z tym strumieniem?

A może jakikolwiek inny strumień, który mogę utworzyć za pomocą ffserver.

używanie tej samej ścieżki, co przy odtwarzaniu z gry, powoduje "Nieobsługiwany schemat adresu URL!"

Z dalszych eksperymentów Próbowałem ffserver serwer HTTP streamingu, ale zakończyła się upaść w MFStreamer Qt :: doRead()

Podobno powinien nazwali BeginRead dla MFStreamer ale tak się nie stało.

Jak odtwarzać strumienie wideo za pomocą QMediaPlayer?

Edycja: tutaj jest mój kod

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

[To tylko link] (http://stackoverflow.com/questions/21448027/play-a-live-video-stream-using-qt), ale myślę, że to ci pomoże. –

+0

Nadal nie mówi, jak podłączyć QMediaPlayer do strumienia lub jakie rodzaje strumieni współpracują z QMediaPlayer. Mój strumień działa z ffplay, mplayer, VLC, ale nie z QMediaPlayer. – 0xbaadf00d

+0

Zaakceptowałem moją odpowiedź, ale jeśli stworzysz taką, która sprawia, że ​​QMediaPlayer odtwarza strumień lub jest po prostu lepsza na jakimś podstawowym poziomie, zmienię znak. – 0xbaadf00d

Odpowiedz

2

znalazłem sposób, aby to działało.

Poddałem się Qt. Faceci z Qt nalegali, żeby to zadziałało, ale nie byli w stanie stworzyć żadnej konfiguracji, która działa. Powiedzieli, że powinien działać, jeśli przesyłasz strumień z VLC, ale nie udało mi się go uruchomić. Próbowałem również streamowania ffmpeg, ffserver i nginx rtmp. Te rzeczy pracowałem z mplayer, ffplay, VLC, a niektóre nawet z Windows Media Player, ale nigdy z QMediaPlayer.

Próbowałem podać adres URL setMedia. Próbowałem utworzyć niestandardową QIODevice, aby odczytać dane strumieniowe i przekazać te dane do QMediaPlayer, który został zainicjowany za pomocą StreamPlayback, ale po prostu nie uda się odczytać danych.

W końcu wszystko, czego potrzebowałem, to coś, co można odtworzyć w strumieniu, jest QWidget i nie jest na licencji GPL.

Użyłem libVLC i vlc-qt, z których oba działają wspaniale.

Po these instructions było łatwe, ale trzeba pamiętać, aby skopiować pliki Główka vlc-qt/Windows/vlc_headers/2,2/ do VLC/sdk/include/vlc/plugins (sic!). Jest to ważne, jeśli tego nie zrobisz, możesz dostać błędy podczas kompilacji. Zwróć uwagę, że te ścieżki mogą być inne, jeśli różne wersje Twojej platformy nie pasują do moich. Ponadto może to nie być konieczne, gdy to czytasz.

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

Bądź własną rękę, nie pracuję dla ciebie: D

Wystarczy upewnić się, że ma pauseButton, playButton, videoUrlEdit (QLineEdit) i videoLayout gdzie zostanie wstawiony widget wideo.

Powiązane problemy