是什么
Qt Multimedia 是一个重要模块,它提供了丰富的 QML 类型和 C++ 类来处理多媒体内容。
提供了访问摄像头和无线电功能所需的 API。
内含的 Qt 音频引擎为用于3D 定位音频播放和内容管理。
#include <QtMultimedia>
#include <QtMultimediaWidgets>
QT += multimedia multimediawidgets
怎么用
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtMultimediaWidgets/QVideoWidget>
#include <QtMultimedia/QMediaPlayer>
#include <QtMultimedia/QMediaPlaylist>
#include <QDebug>
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
layout = new QVBoxLayout;
#if 1
player = new QMediaPlayer(this);
//playlist = new QMediaPlaylist(player);
//playlist->addMedia(QUrl("http://example.com/myclip1.mp4"));
//playlist->addMedia(QUrl("http://example.com/myclip1.mp4"));
videoWidget = new QVideoWidget(this);
layout->addWidget(videoWidget);
player->setVideoOutput(videoWidget);
//关联错误提示信号
connect(player, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>(&QMediaPlayer::error), this, &MainWindow::playerError);
//player->setMedia(QUrl::fromLocalFile("/home/cfan/Desktop/LVGL/lvgl/lvgl/examples/libs/ffmpeg/birds.mp4"));
QUrl rtspUrl;
rtspUrl.setScheme("rtsp");
rtspUrl.setUserName(QUrl::toPercentEncoding("admin")); // 编码用户名
rtspUrl.setPassword(QUrl::toPercentEncoding("p@ssw0rd")); // 编码密码
rtspUrl.setHost("192.168.51.165");
rtspUrl.setPort(554);
rtspUrl.setPath("/cam/realmonitor");
rtspUrl.setQuery("channel=1&subtype=0");
qDebug() << rtspUrl;
player->setMedia(rtspUrl);
videoWidget->show();
//playlist->setCurrentIndex(1);
player->play();
#endif
ui->centralwidget->setLayout(layout);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::playerError(QMediaPlayer::Error error)
{
switch (error) {
case QMediaPlayer::NoError:
qDebug() << "正常解码";
break;
case QMediaPlayer::ResourceError:
qDebug() << "媒体资源无法解析";
break;
case QMediaPlayer::FormatError:
qDebug() << "不支持该媒体资源的格式,没有解码器";
break;
case QMediaPlayer::NetworkError:
qDebug() << "发生网络错误";
break;
case QMediaPlayer::AccessDeniedError:
qDebug() << "没有适当的权限来播放媒体资源";
break;
case QMediaPlayer::ServiceMissingError:
qDebug() << "没没有找到有效的播放服务,播放无法继续";
break;
default:
break;
}
}
可以正常播放本地视频,但是无法播放rtsp流,报错如下
媒体资源无法解析
Error: "Could not open resource for reading and writing."
遇到的问题
1.qt远程调试报错qt.qpa.xcb: could not connect to display
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
13:54:45: Remote process crashed.
2.执行报错报错defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”
3.Error: “Your GStreamer installation is missing a plug-in.”
Your GStreamer installation is missing a plug-in 解决办法
4.Error: "Invalid URI “”.
如果你的 RTSP 流需要提供用户名和密码进行访问,你应该在 URL 中正确提供它们。然而,Qt 在处理包含特殊字符(如 “@”, “:”, “/” 等)的用户名和密码时可能会遇到问题,因为这些字符可能与 URL 中的分隔符冲突。
一种解决方法是使用 QUrl::toPercentEncoding() 函数来对用户名和密码进行编码,以确保它们不会与 URL 分隔符发生冲突。
QUrl rtspUrl;
rtspUrl.setScheme("rtsp");
rtspUrl.setUserName(QUrl::toPercentEncoding("admin")); // 编码用户名
rtspUrl.setPassword(QUrl::toPercentEncoding("p@ssw0rd")); // 编码密码
rtspUrl.setHost("192.168.51.165");
rtspUrl.setPort(554);
rtspUrl.setPath("/cam/realmonitor");
rtspUrl.setQuery("channel=1&subtype=0");
player->setMedia(rtspUrl);