Как я могу воспроизвести поток с QMediaPlayer

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

ffplay rtmp://<IP>/path

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

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

использование того же пути, что и в ffplay, приводит к «Неподдерживаемая схема URL!»

В дальнейших экспериментах я попробовал потоковую передачу ffserver http-сервера, но это закончилось сбоем Qt в MFStreamer :: doRead ()

Очевидно, он должен был вызвать BeginRead для MFStreamer, но это не так.

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

Изменить: вот мой код

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

11

Решение

Я нашел способ заставить это работать.

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

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

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

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

Следующий эти инструкции было легко, но вы должны помнить, чтобы скопировать заголовочные файлы из 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);
}

VideoTest.ui

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

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

3

Другие решения


По вопросам рекламы [email protected]