【Qt】使用QMediaPlayer播放视频

一、工具

        QMedaPlayer播放视频,底层依赖于第三方解码器。windows平台为directShow,linux平台为GStream。window平台可以安装K-Lite,linux平台一般各发行版都会默认安装GSteam。播放RTSP视频时,可以使用VLC播放器搭建一个视频推流服务器,用于拉流的客户端的调试。

1、解码器

K-Lite(window);GStream(Linux)

一般的linux发行版会内置GStream,可以通过如下命令确认是否安装。

gst-inspect-1.0 --version

如果未安装可以使用如下命令,在线安装

sudo apt-get update
sudo apt-get install  gstreamer1.0-tools  gstreamer1.0-alsa  gstreamer1.0-plugins-base  gstreamer1.0-plugins-good  gstreamer1.0-plugins-bad  gstreamer1.0-plugins-ugly  gstreamer1.0-libav  gtk-doc-tools -y

2、VLC播放器

vlc-3.0.21-win64

二、代码demo

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMediaPlayer>
#include <QVideoWidget>
#include
在网上找了一个别人的旧版本的播放器~自己更改了一天,终于可运行了,希望分享下同共学习; 不过出了少少问题:希望有经验的一起指导下: 运行环境:qt creator +windows 1、原计划是可支持视频播放的,现在只能加载间频(mp3),一加载视频就卡死 2.、自定义的进度条不起作用,不知为什么百分比槽连接不成功 connect(wmp, SIGNAL(PositionChange(double, double)),this, SLOT(Slot_onPositionChange(double, double))); 3、我用的是QAxWidget控件,这个是不是只支持windows的呢?或者还有没其实更好的? /******************************************************************************************* 项目名:QT播放Qt Mediaplayer 工程师:枫儿 完成时间:2009年12月28日 技术支持:嵌入式家园 www.studyarm.cn www.mcupark.com *******************************************************************************************/ #include "playerwindow.h" #include #include #include #include #include #include #include #include PlayerWindow::PlayerWindow() { //setCaption(tr("Media Player")); fileFilters = tr("Video files (*.mpg *.mpeg *.avi *.wmv)\n" //原来字符串换行也可这样用 "Audio files (*.mp3 *.wav)"); updateTimer = 0; setMouseTracking(true); this->wmp = new QAxWidget(this); wmp->setControl("{22D6F312-B0F6-11D0-94AB-0080C74C7E95}"); // wmp->setProperty("ShowControls", QVariant(false, 0)); wmp->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); connect(wmp, SIGNAL(PlayStateChange(int, int)),this, SLOT(Slot_onPlayStateChange(int, int))); connect(wmp, SIGNAL(ReadyStateChange(ReadyStateConstants)),this, SLOT(Slot_onReadyStateChange(ReadyStateConstants))); connect(wmp, SIGNAL(PositionChange(double, double)),this, SLOT(Slot_onPositionChange(double, double))); this->openButton = new QPushButton(tr("&Open")); connect(openButton, SIGNAL(clicked()), this, SLOT(Slot_openFile())); this->playPauseButton = new QPushButton(tr("&Play")); connect(playPauseButton, SIGNAL(clicked()), wmp, SLOT(Play())); this->stopButton = new QPushButton(tr("&Stop")); connect(stopButton, SIGNAL(clicked()), wmp, SLOT(Stop())); this->seekSlider = new QSlider(Qt::Horizontal, this); seekSlider->setEnabled(false); connect(seekSlider, SIGNAL(valueChanged(int)),this, SLOT(Slot_sliderValueChanged(int))); connect(seekSlider, SIGNAL(sliderPressed()),wmp, SLOT(Pause())); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(openButton); buttonLayout->addWidget(playPauseButton); buttonLayout->addWidget(stopButton); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(wmp); mainLayout->addLayout(buttonLayout); mainLayout->addWidget(seekSlider); this->setLayout(mainLayout); }
<think>我们使用QtQMediaPlayer播放视频。主要步骤包括: 1. 创建QMediaPlayer对象和视频输出组件(如QVideoWidget)。 2. 设置视频输出(使用setVideoOutput)。 3. 设置媒体源(使用setMedia或setSource,根据Qt版本)。 4. 控制播放播放、暂停、停止等)。 下面是一个简单的示例代码,展示如何在一个窗口中使用QMediaPlayer播放视频。 首先,确保在项目文件(.pro)中添加multimedia模块: ```pro QT += multimedia multimediawidgets ``` 然后,创建一个窗口类(例如MainWindow),在头文件中: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMediaPlayer> #include <QVideoWidget> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: QMediaPlayer *player; QVideoWidget *videoWidget; }; #endif // MAINWINDOW_H ``` 在源文件(.cpp)中: ```cpp #include "mainwindow.h" #include <QUrl> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建视频小部件 videoWidget = new QVideoWidget(this); setCentralWidget(videoWidget); // 创建媒体播放器 player = new QMediaPlayer(this); player->setVideoOutput(videoWidget); // 设置视频输出 // 设置媒体源(这里使用本地文件,也可以使用网络URL) player->setMedia(QUrl::fromLocalFile("C:/path/to/your/video.mp4")); // 请替换为实际路径 // 播放 player->play(); } MainWindow::~MainWindow() { } ``` 注意: - 使用`setMedia`或`setSource`(Qt6中推荐使用`setSource`)来设置媒体源。 - 在Qt5中,使用`setMedia`并传入QMediaContent(可以用QUrl指定文件路径或网络URL)。 - 在Qt6中,QMediaPlayer的接口有所变化,推荐使用`setSource`直接设置QUrl。 另外,为了控制播放进度,可以添加一个滑块(QSlider)和按钮等。下面是一个扩展的示例,包括播放控制按钮和进度条: 在头文件中添加槽函数声明: ```cpp private slots: void onPlayButtonClicked(); void onPauseButtonClicked(); void onStopButtonClicked(); void updateSliderPosition(qint64 position); void setPosition(int position); ``` 在源文件中实现: ```cpp #include "mainwindow.h" #include <QUrl> #include <QHBoxLayout> #include <QPushButton> #include <QSlider> #include <QFileDialog> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建视频小部件 videoWidget = new QVideoWidget(this); setCentralWidget(videoWidget); // 创建播放器 player = new QMediaPlayer(this); player->setVideoOutput(videoWidget); // 创建按钮和滑块 QPushButton *openButton = new QPushButton("打开", this); QPushButton *playButton = new QPushButton("播放", this); QPushButton *pauseButton = new QPushButton("暂停", this); QPushButton *stopButton = new QPushButton("停止", this); QSlider *slider = new QSlider(Qt::Horizontal, this); // 布局 QWidget *controlWidget = new QWidget(this); QHBoxLayout *layout = new QHBoxLayout(controlWidget); layout->addWidget(openButton); layout->addWidget(playButton); layout->addWidget(pauseButton); layout->addWidget(stopButton); layout->addWidget(slider); controlWidget->setLayout(layout); // 将控制部件放在底部 QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addWidget(videoWidget); mainLayout->addWidget(controlWidget); QWidget *centralWidget = new QWidget(this); centralWidget->setLayout(mainLayout); setCentralWidget(centralWidget); // 连接信号和槽 connect(openButton, &QPushButton::clicked, [this](){ QString fileName = QFileDialog::getOpenFileName(this, "打开视频文件"); if (!fileName.isEmpty()) { player->setMedia(QUrl::fromLocalFile(fileName)); player->play(); } }); connect(playButton, &QPushButton::clicked, this, &MainWindow::onPlayButtonClicked); connect(pauseButton, &QPushButton::clicked, this, &MainWindow::onPauseButtonClicked); connect(stopButton, &QPushButton::clicked, this, &MainWindow::onStopButtonClicked); connect(player, &QMediaPlayer::positionChanged, this, &MainWindow::updateSliderPosition); connect(slider, &QSlider::sliderMoved, this, &MainWindow::setPosition); } void MainWindow::onPlayButtonClicked() { player->play(); } void MainWindow::onPauseButtonClicked() { player->pause(); } void MainWindow::onStopButtonClicked() { player->stop(); } void MainWindow::updateSliderPosition(qint64 position) { // 更新滑块位置 QSlider *slider = findChild<QSlider*>(); if (slider) { slider->setMaximum(player->duration()); slider->setValue(position); } } void MainWindow::setPosition(int position) { player->setPosition(position); } ``` 注意:这个示例中,我们通过`positionChanged`信号来更新滑块,通过滑块的`sliderMoved`信号来设置播放位置。 另外,在打开文件时,我们使用了`QFileDialog`来选择视频文件。 请根据实际需要调整代码。同时,注意不同Qt版本(Qt5和Qt6)在多媒体模块上的差异,上述代码主要针对Qt5。在Qt6中,QMediaPlayer的接口有所变化,例如使用`setSource`代替`setMedia`,并且需要引入`QMediaFormat`等。 参考文献: [^1]: Qt系列文章028-基于QMediaPlayer视频播放使用 QMediaPlayer 可以进行视频文件解码,视频播放必须将视频帧在某个界面组件上显示,有 QVideoWidget 和 QGraphicsVideoItem 两种视频显示组件,也可以从这两个类继承,自定义视频显示组件。 [^2]: QT多媒体开发(三):使用QMediaPlayer播放视频使用 QMediaPlayer 播放视频时,必须用函数 setVideoOutput()设置用于显示视频的界面组件, 有 QVideoWidget 和 QGraphicsVideoItem 两种显示视频的组件:QVideoWidget 是 QWidget 的类, 是普通的界面组件;QGraphicsVideoItem 是适用于图形/视图架构的图形项。 [^3]: QT5-qmediaplayer播放视频及进度条控制实例。友好期间,顺道贴上mainwindow.h ... 这个实例展示了如何通过QSlider控制播放进度。 相关问题: 1. 如何在Qt中处理视频播放时的错误? 2. 如何全屏显示视频? 3. 如何自定义视频显示组件(不使用QVideoWidget)?</think>### 如何使用QMediaPlayerQt播放视频Qt使用`QMediaPlayer`播放视频需要以下步骤: #### 1. **环境配置** 在项目文件(.pro)中添加多媒体模块依赖: ```qmake QT += multimedia multimediawidgets ``` #### 2. **核心组件** ```cpp #include <QMediaPlayer> #include <QVideoWidget> // 视频显示组件 #include <QFileDialog> // 文件选择 ``` #### 3. **基本播放实现** ```cpp // 创建播放器和显示组件 QMediaPlayer *player = new QMediaPlayer(this); QVideoWidget *videoWidget = new QVideoWidget(this); // 设置视频输出 player->setVideoOutput(videoWidget); // 设置布局(将视频组件添加到界面) QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(videoWidget); setLayout(layout); // 加载并播放视频 QString filePath = QFileDialog::getOpenFileName(this, "选择视频"); player->setMedia(QUrl::fromLocalFile(filePath)); player->play(); ``` #### 4. **完整功能实现(含进度控制)** ```cpp // 头文件声明 private slots: void updateSlider(qint64 position); void setPosition(int position); // 实现 // 初始化(构造函数中) QSlider *slider = new QSlider(Qt::Horizontal, this); connect(player, &QMediaPlayer::positionChanged, this, &MainWindow::updateSlider); connect(slider, &QSlider::sliderMoved, this, &MainWindow::setPosition); // 槽函数实现 void MainWindow::updateSlider(qint64 position) { slider->setMaximum(player->duration()); slider->setValue(position); } void MainWindow::setPosition(int position) { player->setPosition(position); } ``` #### 5. **关键注意事项** 1. **视频输出组件**: - 必须使用`setVideoOutput()`绑定显示组件(`QVideoWidget`或`QGraphicsVideoItem`)[^1][^2] - 示例:`player->setVideoOutput(videoWidget);` 2. **媒体源设置**: - 本地文件:`QUrl::fromLocalFile("C:/video.mp4")` - 网络流:`QUrl("http://example.com/video.mp4")` 3. **播放控制**: ```cpp player->play(); // 播放 player->pause(); // 暂停 player->stop(); // 停止 ``` 4. **错误处理**: ```cpp connect(player, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error), [=](){ qDebug() << "Error:" << player->errorString(); }); ``` #### 6. **完整示例结构** ```plaintext MainWindow ├── QVideoWidget (视频显示区域) ├── QSlider (进度条) ├── QPushButton (播放/暂停按钮) └── QMediaPlayer (核心播放器) ``` > **注意**:Qt 6中部分接口有调整,如使用`setSource()`替代`setMedia()`,开发时需注意版本差异[^1][^3]。 --- ### 相关问题 1. 如何处理QMediaPlayer无法播放某些视频格式的问题? 2. 如何实现视频全屏显示和退出全屏功能? 3. 如何在Qt中捕获视频帧并进行图像处理? 4. QMediaPlayer和QAudioOutput如何配合实现音视频同步? [^1]: Qt系列文章028-基于QMediaPlayer视频播放使用 QMediaPlayer 可以进行视频文件解码,视频播放必须将视频帧在某个界面组件上显示,有 QVideoWidget 和 QGraphicsVideoItem 两种视频显示组件。 [^2]: QT多媒体开发(三):使用QMediaPlayer播放视频使用 QMediaPlayer 播放视频时,必须用函数 setVideoOutput()设置用于显示视频的界面组件。 [^3]: QT5-qmediaplayer播放视频及进度条控制实例。展示了如何通过QSlider控制播放进度,并提供了完整的头文件声明示例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值