Qt中使用VLC实现一个简单本地视频播放器

环境介绍

Qt版本:5.15.2
VLC版本:3.0.20
编译器:MinGW 64
系统:Win11

 效果

可以自己去增加功能和美化如:进度条,视频速度,显示视频时长等 

下载VLC的SDK文件

VLC库官网下载地址:https://www.videolan.org/

所有VLC的SDK下载地址:https://ftp.heanet.ie/pub/videolan/vlc/

3.0.20的SDK下载地址:https://ftp.heanet.ie/pub/videolan/vlc/last/win64/ 

下载完成后解压 

需要的文件 

进入文件夹 ,需要的一个是SDK文件夹和运行所需要的.dll和plugins

 SDK文件下是我们需要的头文件和lib库

创建工程 

将sdk文件夹放到工程目录下

pro文件 

 新建一个工程,在xxx.pro加入路径,这里的路径代表当前工程目录下的路径

INCLUDEPATH += $$PWD\sdk\include
LIBS += $$PWD\sdk\lib\libvlc.lib \
        $$PWD\sdk\lib\libvlccore.lib

将上面提到的文件和文件夹放入可执行文件.exe目录的下面 

ui文件设置 

 

mainwindow.h文件 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <vlc/vlc.h>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void OpenVideoFile();

public:
    void MediaShowWindow(libvlc_media_player_t*player);
    void MediaPlayerPlay();
private:
    Ui::MainWindow *ui;
    libvlc_instance_t*m_instence;
    libvlc_media_player_t*m_vlcplayer = nullptr;

    bool is_playing = false;
    int m_currentVolume;
};
#endif // MAINWINDOW_H

 mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //初始化
    ui->btn_play->setText("暂停");
    ui->Slider_volume->setMaximum(100);
    ui->Slider_volume->setValue(100);

    m_instence = libvlc_new(0,nullptr);
    if(m_instence == nullptr){
        qDebug()<<"instence null";
    }else{
        qDebug()<<"ok...";
    }

    //选择文件
    connect(ui->btn_open,&QPushButton::clicked,this,&MainWindow::OpenVideoFile);

    //播放暂停
    connect(ui->btn_play,&QPushButton::clicked,this,[=](){
        if(m_vlcplayer == nullptr){
            QMessageBox::warning(this,"无视频","请选择一个视频");
            return;
        }
        if(is_playing){
            libvlc_media_player_pause(m_vlcplayer);
            ui->btn_play->setText("播放");
            is_playing = false;

        }else{
            libvlc_media_player_play(m_vlcplayer);
            ui->btn_play->setText("暂停");
            is_playing = true;
        }
    });
    //音量调节
    connect(ui->Slider_volume,&QSlider::valueChanged,this,[=](int value){
        if(m_vlcplayer != nullptr){
            int volume = static_cast<int>(static_cast<float>(value) / ui->Slider_volume->maximum() * 100);
            libvlc_audio_set_volume(m_vlcplayer, volume);

            m_currentVolume = volume;
            ui->statusbar->showMessage("音量为: " + QString::number(volume));
        }
    });
}

MainWindow::~MainWindow()
{
    if(m_instence != nullptr){
        libvlc_release(m_instence);
        m_instence = nullptr;
    }
    delete ui;
}

void MainWindow::OpenVideoFile()
{
    if(m_vlcplayer != nullptr){
        libvlc_media_player_stop(m_vlcplayer);
        libvlc_media_player_release(m_vlcplayer);
        m_vlcplayer = nullptr;
    }

    //选择文件
    QString filepath = QFileDialog::getOpenFileName(this,tr("open video"),tr("E:\\pic"),tr("Video Files(*.avi *.mp4 *.mkv *.mp3 *.wma)"));
    if(filepath.isEmpty()){
        qDebug()<< "path is null";
        return;
    }
    filepath = QDir::toNativeSeparators(filepath);

    libvlc_media_t*media = libvlc_media_new_path(m_instence,filepath.toUtf8().data());

    libvlc_media_parse(media);

    m_vlcplayer = libvlc_media_player_new_from_media(media);
    libvlc_media_release(media);

    //设置窗口句柄
    MediaShowWindow(m_vlcplayer);
    //播放
    MediaPlayerPlay();
}

void MainWindow::MediaShowWindow(libvlc_media_player_t *player)
{
    libvlc_media_player_set_hwnd(player,(void*)ui->widget_player->winId());
}

void MainWindow::MediaPlayerPlay()
{
    if(m_vlcplayer == nullptr){
        qDebug()<<"m_vlcplayer is null";
        return;
    }

    libvlc_media_player_play(m_vlcplayer);
    is_playing = true;
}

 

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现一个基于 QtVLC视频播放器,可以通过以下步骤实现: 1. 在 Qt 创建一个新的项目,选择 Qt Widgets Application。 2. 在项目添加 VLC 的头文件和库文件路径。在 .pro 文件添加以下代码: ``` INCLUDEPATH += /path/to/vlc/include LIBS += -L/path/to/vlc/lib -lvlc ``` 3. 在 Qt Designer 创建一个主窗口,添加一个 QMediaPlayer 控件和两个 QPushButton 控件。一个用于上一曲,一个用于下一曲。 4. 在主窗口的构造函数创建一个 QMediaPlayer 对象,并且将其设置到 QVideoWidget 控件: ``` QMediaPlayer *player = new QMediaPlayer(this); QVideoWidget *videoWidget = new QVideoWidget(this); player->setVideoOutput(videoWidget); ``` 5. 在 QPushButton 的 clicked 信号,调用 QMediaPlayer 的相应接口进行上一曲和下一曲操作: ``` connect(prevButton, &QPushButton::clicked, [=]() { playlist->previous(); }); connect(nextButton, &QPushButton::clicked, [=]() { playlist->next(); }); ``` 6. 创建一个 QMediaPlaylist 对象,用于管理视频文件列表,并将列表设置到 QMediaPlayer : ``` QMediaPlaylist *playlist = new QMediaPlaylist(this); playlist->addMedia(QUrl::fromLocalFile("/path/to/video1.mp4")); playlist->addMedia(QUrl::fromLocalFile("/path/to/video2.mp4")); playlist->addMedia(QUrl::fromLocalFile("/path/to/video3.mp4")); player->setPlaylist(playlist); ``` 7. 最后,播放视频: ``` player->play(); ``` 这样,一个基于 QtVLC视频播放器就完成了,并且可以实现上一曲和下一曲功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值