Воспроизведение видео в текущем окне или закрытие последнего окна в Qt4 - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать приложение, которое будет воспроизводить бездействующее видео, и когда оно получит пакет TCP, оно начнет воспроизводить видео по пути, указанному в пакете TCP. Теперь все это работает, но когда приложение получает пакет и начинает воспроизводить видео, оно запускается в новом окне. Это означает, что сейчас воспроизводятся 2 видео одновременно, и это вызывает проблемы с производительностью.

В основном у меня есть класс Server и класс MediaPlayer. Когда я вызываю функцию для запуска видео из MediaPlayer, она запускается нормально, но когда я вызываю функцию с сервера, она запускается в новом окне.

mediaplayer.h:

class MediaPlayer : public QWidget
{
    Q_OBJECT
public:
    MediaPlayer()

    //public functions
    void startVideo(QString contentLink);

private:
    Phonon:MediaObject m_MediaObject;
};

class Server : public QDialog
{
    Q_OBJECT
public:
    explicit Server(QWidget *parent = nullptr);

public slots:
    void readAll();
    void onNewConnection();
    void onSocketStateChanged(QAbstractSocket::SocketState socketState);

private:
    QTcpSocket *tcpSocket = nullptr;
}

mediaplayer.cpp:

MediaPlayer::MediaPlayer() : 
    ui(nullptr), m_AudioOutput(Phonon::VideoCatergory),
    m_videoWidget(new MediaVideoWidget(this))
{}

void MediaPlayer::startVideo(QString contentLink);
{
    qDebug() << "startVideo initiated...";
    if (QFile::exists(contentLink) != true) {
        m_MediaObject.stop();
        m_MediaObject.setCurrentSource(noContent); //noContent is extracted from a config file
        m_MediaObject.play();
        qDebug() << "No video!, " << contentLink;
    } else {
        m_MediaObject.stop();
        m_MediaObject.setCurrentSource(contentLink);
        m_MediaObject.play();
        m_MediaObject.enqueue(contentLink);
        qDebug() << "Video!, " << contentLink;
    }
}

Server::Server(QWidget *parent) : 
    QDialog(parent), tcpServer(nullptr), networkSession(nullptr)
{
    tcpSocket = new QTcpSocket(this);
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

void Server::onNewConnection()
{
    qDebug() << "onNewConnection";

    tcpSocket = tcpServer->nextPendingConnection();
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readAll()));
    connect(tcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)))
}

void Server::onSocketStateChanged(QAbstractSocket::SocketState socketState)
{
    if (socketState == QAbstractSocket::UnconnectedState)
    {
        QTcpSocket *sender = static_cast<QTcpSocket*>(QObject::sender());
        if (sender == tcpSocket)
        {
            sender->deleteLater();
        }
    }
}

void Server::readAll()
{
    qDebug() << "readAll initiated...";

    MediaPlayer *contentPlayer = new MediaPlayer;
    if (tcpSocket->bytesAvailable())
    {
        QString contentLink = tcpSocket->readAll();
        qDebug() << contentLink;
        contentPlayer->startVideo(contentLink);
    }
}

Теперь я попытался добавить hide (); или close (); функции startVideo () , но затем она вызвала функцию startVideo () , и я увидел сообщения qDebug () , но видео не запустилось. Он просто продолжал проигрывать простое видео, которое зацикливается при запуске. Я также пытался сделать это с MediaPlayer contentPlayer и contentPlayer.startVideo (contentLink); в функции readAll () , но тогда он даже не вызывает Функция startVideo () .

Я работаю с Qt Creator 4.8.2 на Raspberry Pi Model 4 под управлением Raspbian.

...