如何使用Gstreamer从UDP套接字接收在Qt应用程序中显示流视频帧

问题描述

我想使用Qt Multimedia来显示视频流。 我跑了 @服务器:$ gst-launch-1.0 -v videotestsrc pattern = ball! video / x-raw,width = 1280,height = 720! jpegenc! rtpjpegpay! udpsink名称=接收器主机=本地主机端口= 34400 sync = false async = false
@client:$ gst-launch-1.0 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 它的工作正常。 现在我想在一个终端上执行服务器命令,而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


解决方法

从Qt 5.12.2开始,如果使用GStreamer后端,则可以将GStreamer管道传递给QMediaPlayer :: setMedia()。在您的情况下,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\""));
...

看看documentation 以获得更多信息。

,

我已经编辑了我的应用程序,但仍然遇到同样的问题。

svcutil