2015-05-28 15 views
9

Tôi đã thiết lập một máy chủ và video để tôi có thể kết nối với các dòng với ffplay sử dụng dòng lệnh sau:Làm thế nào để tôi chơi một dòng với QMediaPlayer

ffplay rtmp://<IP>/path 

Có thể sử dụng QMediaPlayer QMediaContent hoặc thứ gì đó để kết nối với luồng này?

Hoặc có thể là bất kỳ loại luồng nào khác mà tôi có thể tạo bằng ffserver.

sử dụng cùng một đường dẫn với kết quả ffplay trong "Lược đồ url không được hỗ trợ!"

Với thí nghiệm hơn nữa tôi đã cố gắng ffserver máy chủ http trực tuyến, nhưng điều đó đã kết thúc với Qt đâm trong MFStreamer :: doRead()

Rõ ràng nó cần phải có gọi BeginRead cho MFStreamer nhưng nó thì không.

Tôi làm cách nào để phát luồng video bằng QMediaPlayer?

Edit: đây là mã của tôi

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

[Nó chỉ là một liên kết] (http://stackoverflow.com/questions/21448027/play-a-live-video-stream-using-qt) nhưng tôi nghĩ điều này sẽ giúp bạn. –

+0

Nó vẫn không nói cách kết nối QMediaPlayer với luồng hoặc loại luồng nào hoạt động với QMediaPlayer. Luồng của tôi hoạt động với ffplay, mplayer, VLC nhưng không hoạt động với QMediaPlayer. – 0xbaadf00d

+0

Tôi chấp nhận câu trả lời của mình, nhưng nếu bạn sản xuất câu trả lời khiến QMediaPlayer phát trực tuyến hoặc chỉ tốt hơn ở một số mức cơ bản, tôi sẽ thay đổi điểm. – 0xbaadf00d

Trả lời

2

Tôi tìm thấy một cách để làm cho nó hoạt động.

Tôi đã từ bỏ Qt. Các chàng trai ở Qt đã khăng khăng rằng nó sẽ hoạt động, nhưng không thể tạo ra bất kỳ cấu hình nào hoạt động. Họ nói rằng nó sẽ làm việc nếu bạn stream từ VLC, nhưng tôi đã không làm cho nó hoạt động. Tôi cũng đã thử ffmpeg, ffserver và nginx rtmp streaming. Tôi có những thứ này làm việc với mplayer, ffplay, VLC và một số thậm chí với Windows Media Player, nhưng không bao giờ QMediaPlayer.

Tôi đã cố gắng chỉ cung cấp URL cho setMedia. Tôi đã cố gắng tạo một QIODevice tùy chỉnh để đọc dữ liệu luồng và cung cấp dữ liệu đó cho QMediaPlayer được khởi tạo với StreamPlayback, nhưng nó sẽ không thành công trong việc đọc dữ liệu.

Cuối cùng, tất cả những gì tôi cần là một thứ gì đó để phát luồng, là QWidget và không được cấp phép GPL.

Tôi đã sử dụng libVLCvlc-qt cả hai đều hoạt động tuyệt vời.

Sau these instructions là dễ dàng, nhưng bạn cần phải nhớ để sao chép các tập tin tiêu đề từ vlc-qt/windows/vlc_headers/2.2/ để vlc/sdk/include/vlc/plugins (sic). Điều này là quan trọng, nếu bạn không làm điều này bạn có thể nhận được lỗi trong quá trình biên dịch. Lưu ý rằng các đường dẫn này có thể khác nếu bạn có các phiên bản nền tảng khác nhau không khớp với các đường dẫn của tôi. Ngoài ra, nó có thể không cần thiết khi bạn đọc nó.

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

Hãy riêng của bạn, tôi không làm việc cho bạn: D

Chỉ cần chắc chắn rằng nó có pauseButton, playButton, videoUrlEdit (QLineEdit) và videoLayout mà widget video sẽ được chèn vào.

Các vấn đề liên quan