问题描述
我想使用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