QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例,记录其用法及进度条qslider的控制。

首先,制作一个简单的界面文件mainwindow.ui:

然后,下载一个mp4或其他格式视频(比如mkv),基于以上UI进行播放控制操作。

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    timer = new QTimer();
    ui->setupUi(this);
    player = new QMediaPlayer;
    list = new QMediaPlaylist(player);
    //list->addMedia(QUrl::fromLocalFile("/home/m30.mp4"));
    //list->addMedia(QUrl::fromLocalFile("/home/share/2023.mkv"));
    list->addMedia(QUrl::fromLocalFile("/home/share/50.mp4"));
    list->setCurrentIndex(0);
    list->setPlaybackMode(QMediaPlaylist::Loop);
    player->setPlaylist(list);
    ui->widget->setAspectRatioMode(Qt::IgnoreAspectRatio);
    long time = player->duration();
    printf("duration: %lld\n", player->duration());
    player->setVideoOutput(ui->widget);
    timer->setInterval(5000);
    connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
    timer->start();

    ui->horizontalSlider->setValue(0);
    connect(player, &QMediaPlayer::durationChanged, ui->horizontalSlider, &QSlider::setMaximum);
    connect(player, &QMediaPlayer::positionChanged, ui->horizontalSlider, &QSlider::setValue);
    connect(ui->horizontalSlider, &QSlider::sliderMoved, this, [this](int value){
        printf("slide: %d\n", value);
        player->setPosition(value);
    });
    player->setVolume(100);
    player->play();

    //player->setPosition();
}
void MainWindow::onTimeout()
{
    printf("timeout\n");

    player->setPosition(30*1000);
}
MainWindow::~MainWindow()
{
    delete ui;
    player->stop();
    if (player)
        delete player;
    if(list)
        delete list;
}

代码集成了两种控制方式:1.定时5秒循环让进度跳到某个30秒位置;2.手动拖动进度条控制播放进度。

友好期间,顺道贴上mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QMediaPlaylist>
#include <QTimer>
#include <QSlider>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QMediaPlayer *player;
    QVideoWidget * videoWidget;
    QMediaPlaylist * list;
    QTimer* timer;
    QSlider* slid;
public slots:
    void onTimeout();
};

#endif // MAINWINDOW_H

另外,如果遇到运行时闪退报找不到合适的解码器的错误的话,需要先安装解码器:

sudo apt install gstreamer1.0-libav -y

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 15:54:02       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 15:54:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 15:54:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 15:54:02       18 阅读

热门阅读

  1. PostgreSQL Systemctl启动设置

    2024-04-08 15:54:02       13 阅读
  2. pycharm控制台中文显示乱码的解决方案

    2024-04-08 15:54:02       12 阅读
  3. vue watch监听的多种使用

    2024-04-08 15:54:02       16 阅读
  4. 面试反问环节

    2024-04-08 15:54:02       14 阅读
  5. Spring集成MyBatis

    2024-04-08 15:54:02       16 阅读
  6. 注入类型(一)

    2024-04-08 15:54:02       13 阅读
  7. opencv+python(图形绘制)

    2024-04-08 15:54:02       14 阅读
  8. set feedback 和set define

    2024-04-08 15:54:02       29 阅读
  9. 介绍 TensorFlow 的基本概念和使用场景。

    2024-04-08 15:54:02       15 阅读