Как отображать кадры потокового видео в приложении Qt с помощью Gstreamer, полученного из UDP-сокета

Я хотел бы использовать Qt Multimedia для отображения видеопотока. Я запустил @server: $ gst-launch-1.0 -v videotestsrc pattern = ball! видео / x-raw, ширина = 1280, высота = 720! jpegenc! rtpjpegpay! udpsink name = host = localhost port = 34400 sync = false async = false
@client: $ gst-launch-1.0 udpsrc port = 34400 caps = application / x-rtp, media = (string) video, clock- rate = (int) 90000, имя-кодировки = (строка) JPEG, полезная нагрузка = (int) 26! rtpjpegdepay! jpegdec! filesink location = a.mp4 Он работает нормально. теперь я хочу, чтобы серверная команда выполнялась на одном терминале, и приложение Qt должно играть роль клиента, чтобы воспроизводить видео. Я пробовал одно приложение, но оно не работает.

main.cpp
#include <QApplication>
#include <QMediaPlayer>
#include <QWidget>
#include <QVideoWidget>
#include <QBoxLayout>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *window = new QWidget;
    QVideoWidget *videoWidget = new QVideoWidget;
    QBoxLayout *layout = new QVBoxLayout;
    QMediaPlayer *player = new QMediaPlayer;
    QProcess *process = new QProcess;

    layout->addWidget(videoWidget);
    window->setLayout(layout);
    window->show();
    player->setVideoOutput(videoWidget);
    QString program = "gst-launch-1.0";
    QStringList arguments;
    arguments << "udpsrc" << "port=34400" << "caps=application/x-rtp, media=(string)video, 
    clock-rate=(int)90000, encoding-name=(string)JPEG, payload=(int)26" << "!" << "rtpjpegdepay" 
    << "!" << "jpegdec" << "!" << "filesink location=a.mp4" ;
    
    process->setReadChannel(QProcess::StandardError);
    process->start(program, arguments);

    while (!process->waitForReadyRead()) {}

    player->setMedia(QMediaContent(), process);
    player->play();

    return a.exec();

QT       += core gui multimedia multimediawidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = video_play_file
TEMPLATE = app


SOURCES += main.cpp\
        dialog.cpp

HEADERS  += dialog.h

FORMS    += dialog.ui



person Pooja    schedule 22.10.2020    source источник


Ответы (2)


Начиная с Qt 5.12.2, вы можете передавать конвейеры GStreamer в QMediaPlayer :: setMedia (), если используется бэкэнд GStreamer. В вашем случае код для setMedia () должен выглядеть примерно так (не проверено):

...
player->setMedia(QUrl("gst-pipeline: udpsrc port=34400 caps=\"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)JPEG, payload=(int)26\" ! rtpjpegdepay ! jpegdec ! videoconvert ! xvimagesink name=\"qtvideosink\""));
...

Дополнительную информацию см. В документации.

person ptr    schedule 22.10.2020
comment
Спасибо за оперативную помощь. Я сначала протестировал player = new QMediaPlayer; player->setMedia(QUrl("gst-pipeline: videotestsrc ! autovideosink")); player->play(); qDebug() <<player->state(); return a.exec(); }, но выдает ошибку: для \ gst-pipeline \ не реализован обработчик URI. - person Pooja; 22.10.2020
comment
Какую версию Qt вы используете? Требуется как минимум Qt 5.12.2. Ваше клиентское приложение Qt работает в Linux? Бэкэнд Gstreamer Qt Multimedia поддерживается только в Linux. - person ptr; 22.10.2020
comment
Да, верно, из-за версии Qt, которую я использую (QT Creator 3.5.1). поэтому я начал создавать новую версию QT Qt 5.12.0. - person Pooja; 23.10.2020
comment
Не могли бы вы предложить мне версию Qt, которая поддерживает конвейер Gstreamer и ссылки для настройки этого QT на Linux, столкнувшись с некоторой проблемой с версией 5.12.0. - person Pooja; 23.10.2020
comment
В документации указано, что требуется как минимум Qt 5.12.2. Установите последнюю версию Ubuntu LTS (20.04, Focal Fossa). Он включает libqt5multimedia5 версии 5.12.8. Инструкции см. Здесь: ubuntu.com/tutorials/install-ubuntu-desktop - person ptr; 24.10.2020
comment
Я думаю, что это выходит за рамки ваших первоначальных вопросов. Начать новый вопрос по такой инструкции. - person ptr; 27.10.2020
comment
Да, верно, птр. Я установил Qt 5.12.0 на ubuntu 16.06 LTS. - person Pooja; 27.10.2020
comment
Здравствуйте, ptr, я установил Qt 5.12.9 на ubuntu и попробовал вышеуказанное приложение с вашим комментарием. Я могу создавать и запускать, но виджет Qt ничего не показывает на экране. не могли бы вы предложить? - person Pooja; 28.10.2020
comment
Привет, птр. Я отредактировал свое приложение, но все еще сталкиваюсь с той же проблемой. - person Pooja; 28.10.2020

Я отредактировал свое приложение, но все еще сталкиваюсь с той же проблемой.

#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //Dialog w;
    //w.show();
     QMediaPlayer* player =new QMediaPlayer;
     QVideoWidget* vw= new QVideoWidget;
     player->setVideoOutput(vw);                                                                          
     player->setMedia(QUrl("gst-pipeline: udpsrc port=34400 caps=\"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)JPEG, payload=(int)26\" ! rtpjpegdepay ! jpegdec ! videoconvert ! xvimagesink name=\"qtvideosink\""));
     vw->setGeometry(100,100,300,400);
     vw->show();
     player->play();
     qDebug() <<player->state();
     return a.exec();
}                                                                                                                                  
 ````                                                                                                                                         ERROR:Error: "No URI handler implemented for \"gst-pipeline\".":                                             
person Pooja    schedule 28.10.2020
comment
Если вы получили сообщение об ошибке, обработчик URI не реализован для \ gst-pipeline \. Я думаю, вы все еще используете версию Qt до 5.12.2 - person ptr; 29.10.2020
comment
Я не понимаю, почему я получаю эту ошибку. У меня есть сборка Qt 5.12.9 Qmake version $$ qmake -version QMake version 3.1 Использование Qt версии 5.12.9 в /----------------PATH›/QT_5_12_9/5.12.9/gcc_64/lib - person Pooja; 03.11.2020
comment
Может быть, вы создали свою версию Qt без поддержки GStreamer? - person ptr; 05.11.2020