首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >QT应用编程:基于VLC开发音视频播放器(句柄方式)

QT应用编程:基于VLC开发音视频播放器(句柄方式)

作者头像
DS小龙哥
发布于 2022-01-07 06:34:39
发布于 2022-01-07 06:34:39
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

一、环境介绍

操作系统: win10 64位

QT版本: QT5.12.6

编译器: MinGW 32

VLC版本: 3.0.12

功能说明: 下面的播放器例子支持基本播放器的功能。

1. 支持鼠标点击进度条跳转到指定帧

2. 支持音量设置、静音设置

3. 支持加载视频、暂停、停止、重播

4. 播放速率设置

5. 播放总时间与当前时间显示

完整项目代码下载地址: https://download.csdn.net/download/xiaolong1126626497/16579867

二、下载VLC的SDK文件

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

所有的VLC版本下载地址: http://ftp.heanet.ie/pub/videolan/vlc

3.0.12的SDK下载地址: http://ftp.heanet.ie/pub/videolan/vlc/last/win32/

三、创建QT工程,编写简单的播放器

3.1 拷贝SDK文件到工程目录下

将下载目录下的sdk文件夹拷贝到QT的工程目录下,方便引用库和头文件。

3.2 pro工程文件里加路径

3.3 ui文件

3.4 widget.cpp代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "widget.h"
#include "ui_widget.h"

Widget* Widget::pThis = nullptr;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    pThis=this;

    ui->setupUi(this);
    this->setWindowTitle("视频播放器");

    //VLC相关的初始化
    vlc_base=libvlc_new(0, nullptr); //创建并初始化libvlc实例
    if(!vlc_base)
    {
        qDebug()<<"libvlc_new 执行错误.";
    }


    //播放速度设置
    ui->MediaSpeedBtn->setCheckable(true);
    m_TimeSpeedGrp = new QActionGroup(this);

    QStringList strSpeedItems;
    strSpeedItems << tr("0.03X") << tr("0.06X") << tr("0.1X") << tr("0.15X") << tr("0.2X") << tr("0.3X") << tr("0.4X") << tr("0.5X") << tr("0.6X") << tr("0.8X") << tr("1.0X") << tr("1.25X") << tr("1.5X") << tr("2.0X") << tr("4.0X") << tr("8.0X");
    float speeds[] = { 0.03, 0.06, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5,0.6,0.8,1.0,1.25,1.5,2.0,4.0,8.0};

    for (int i = 0; i < strSpeedItems.size(); i++)
    {
        QAction *pSpeedItem = m_SpeedMenu.addAction(strSpeedItems.at(i));
        pSpeedItem->setData(QVariant::fromValue(speeds[i]));
        pSpeedItem->setCheckable(true);
        m_TimeSpeedGrp->addAction(pSpeedItem);
        if (i == 10)
        {
            pSpeedItem->setChecked(true);
        }
    }
    connect(m_TimeSpeedGrp, SIGNAL(triggered(QAction *)), this, SLOT(slot_onSetTimeSpeed(QAction *)));

    //事件监听
    ui->horizontalSlider_pos->installEventFilter(this);
    ui->horizontalSlider_volume->installEventFilter(this);
}


Widget::~Widget()
{
    delete ui;
    libvlc_release(vlc_base); //减少libvlc实例的引用计数,并销毁它
}


bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if(obj==ui->horizontalSlider_pos)
    {
        if (event->type()==QEvent::MouseButtonPress)           //判断类型
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton)	//判断左键
            {
               int value = QStyle::sliderValueFromPosition(ui->horizontalSlider_pos->minimum(), ui->horizontalSlider_pos->maximum(), mouseEvent->pos().x(), ui->horizontalSlider_pos->width());
               ui->horizontalSlider_pos->setValue(value);

               //跳转播放器
               float f_value=(float)value/(float)ui->horizontalSlider_pos->maximum();
               libvlc_media_player_set_position(vlc_mediaPlayer,f_value);
            }
        }
    }

    if(obj==ui->horizontalSlider_volume)
    {
        if (event->type()==QEvent::MouseButtonPress)           //判断类型
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton)	//判断左键
            {
               int value = QStyle::sliderValueFromPosition(ui->horizontalSlider_volume->minimum(), ui->horizontalSlider_volume->maximum(), mouseEvent->pos().x(), ui->horizontalSlider_volume->width());
               ui->horizontalSlider_volume->setValue(value);
               //设置音量
               if(vlc_mediaPlayer)libvlc_audio_set_volume(vlc_mediaPlayer,value);
            }
        }
    }
    return QWidget::eventFilter(obj, event);
}


/*
工程: QtVLC_Player
日期: 2021-03-24
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 打开本地文件
*/
void Widget::on_pushButton_open_clicked()
{
    /*选择文件*/
    QString filename=QFileDialog::getOpenFileName(this,"选择打开的文件","D:/",tr("*.*"));

    /* 将 / 转为windows下的右斜杆 */
    std::replace(filename.begin(), filename.end(), QChar('/'), QChar('\\'));
    qDebug()<<"播放的媒体:"<<filename;

    /*为特定文件路径创建媒体*/
    if(vlc_media)libvlc_media_release(vlc_media);
    vlc_media=libvlc_media_new_path(vlc_base,filename.toUtf8().data());
    if(vlc_media==nullptr)
    {
        qDebug()<<"libvlc_media_new_path 执行错误.";
        return;
    }

    /*根据给定的媒体对象创建一个播放器对象*/
    if(vlc_mediaPlayer)libvlc_media_player_release(vlc_mediaPlayer);
    vlc_mediaPlayer=libvlc_media_player_new_from_media(vlc_media);

    /*解析媒体实例*/
    // libvlc_media_parse(vlc_media);

    /*获取媒体播放器事件管理器*/
    libvlc_event_manager_t *em = libvlc_media_player_event_manager(vlc_mediaPlayer);
    libvlc_event_attach(em, libvlc_MediaPlayerTimeChanged, vlcEvents, this);
    libvlc_event_attach(em, libvlc_MediaPlayerEndReached, vlcEvents, this);
    libvlc_event_attach(em, libvlc_MediaPlayerStopped, vlcEvents, this);
    libvlc_event_attach(em, libvlc_MediaPlayerPlaying, vlcEvents, this);
    libvlc_event_attach(em, libvlc_MediaPlayerPaused, vlcEvents, this);

    /*设置给予媒体播放器媒体输出的win32/win64窗口句柄*/
    libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui->widget_VideoPlay->winId());
    //如果不使用句柄方式,VLC也支持回调方式处理图像,这种方式可以自己提取图像数据,自己渲染显示处理. libvlc_video_set_callbacks

    /*播放媒体文件*/
    if(vlc_mediaPlayer)libvlc_media_player_play(vlc_mediaPlayer);

    //等待VLC解析文件.否则下面的时间获取不成功
    QThread::msleep(100);

    //获取媒体文件总长度 ms
    libvlc_time_t length = libvlc_media_player_get_length(vlc_mediaPlayer);
    qDebug()<<"媒体文件总长度:"<<length;
    ui->label_t2->setText(QString("%1").arg(length));
    ui->horizontalSlider_pos->setMaximum(length);
    ui->horizontalSlider_pos->setMinimum(0);

    //获取当前媒体播放的位置
    libvlc_time_t current_movie_time=libvlc_media_player_get_time(vlc_mediaPlayer);
    qDebug()<<"获取当前媒体播放的位置:"<<current_movie_time;


    unsigned int width=0,height=0;
    libvlc_video_get_size(vlc_mediaPlayer,0,&width,&height);
    qDebug()<<"视频尺寸:"<<"width:"<<width<<"height:"<<height;

    /*获取媒体播放器使用的媒体。*/
    ui->label_video_name->setText(QString("%1:%2x%3").arg(filename).arg(width).arg(height));

    //暂停: 停留在第一帧画面
    if(vlc_mediaPlayer)libvlc_media_player_pause(vlc_mediaPlayer);
}


/*
工程: QtVLC_Player
日期: 2021-03-24
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: VLC的事件回调
*/
void Widget::vlcEvents(const libvlc_event_t *ev, void *param)
{
     qint64 pos;
    switch (ev->type){
    case libvlc_MediaPlayerTimeChanged:
         qDebug() << "VLC媒体播放器时间已更改";
         //获取当前媒体播放的位置
         pos=libvlc_media_player_get_time(pThis->vlc_mediaPlayer);
         pThis->ui->label_t1->setText(QString("%1").arg(pos));
         pThis->ui->horizontalSlider_pos->setValue(pos);
         break;
    case libvlc_MediaPlayerEndReached:
         qDebug() << "VLC播放完毕.";
        break;
    case libvlc_MediaPlayerStopped:
        qDebug() << "VLC停止播放";
        break;
    case libvlc_MediaPlayerPlaying:
        qDebug() << "VLC开始播放";
        break;
    case libvlc_MediaPlayerPaused:
        qDebug() << "VLC暂停播放";
        break;
    }
}


/*
工程: QtVLC_Player
日期: 2021-03-24
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 暂停
*/
void Widget::on_pushButton_pause_clicked()
{
     if(vlc_mediaPlayer)libvlc_media_player_pause(vlc_mediaPlayer);
}

/*
工程: QtVLC_Player
日期: 2021-03-24
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 停止
*/
void Widget::on_pushButton_stop_clicked()
{
    if(vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer);
}

/*
工程: QtVLC_Player
日期: 2021-03-24
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 速率
*/
void Widget::slot_onSetTimeSpeed(QAction *action)
{
    action->setChecked(true);
    ui->MediaSpeedBtn->setToolTip(action->text());
    ui->MediaSpeedBtn->setText(action->text());

    /*设置播放速率*/
    if(vlc_mediaPlayer)libvlc_media_player_set_rate(vlc_mediaPlayer,float(action->data().toFloat()));
}

void Widget::on_MediaSpeedBtn_clicked()
{
    QPoint ptWgt = ui->MediaSpeedBtn->mapToGlobal(QPoint(0, 0));
    ptWgt -= QPoint(10, 180);
    QAction *pSelect = m_SpeedMenu.exec(ptWgt);
    if (pSelect == nullptr)
        return;
}

void Widget::on_pushButton_get_state_clicked()
{
    if(vlc_mediaPlayer)
    {
        //4表示暂停  3表示继续   5表示停止
        qDebug()<<"播放状态:"<<libvlc_media_player_get_state(vlc_mediaPlayer);
    }
}


void Widget::on_pushButton_reset_clicked()
{
    /*需要先停止才可以继续重头播放*/
    if(vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer);
    /*播放媒体文件*/
    if(vlc_mediaPlayer)libvlc_media_player_play(vlc_mediaPlayer);
}

//静音切换
void Widget::on_pushButton_volume_clicked()
{
    static bool state=false;
    state=!state;
    if(state)
    {
        //静音
        if(vlc_mediaPlayer)libvlc_audio_set_volume(vlc_mediaPlayer,0);
    }
    else
    {
        int val=ui->horizontalSlider_volume->value();
        qDebug()<<"设置音量:"<<val;
        if(vlc_mediaPlayer)libvlc_audio_set_volume(vlc_mediaPlayer,val);
    }
}

//音量滑块
void Widget::on_horizontalSlider_volume_valueChanged(int value)
{
    //设置音量
    if(vlc_mediaPlayer)libvlc_audio_set_volume(vlc_mediaPlayer,value);
}

3.5 widget.h代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <vlc/vlc.h>
#include <QFileDialog>
#include <QDebug>
#include <QThread>
#include <QActionGroup>
#include <QMenu>
#include <QMouseEvent>
#include <QStyle>
#include <QTimer>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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


private slots:
    void on_pushButton_open_clicked();
    void on_pushButton_pause_clicked();
    void on_pushButton_stop_clicked();
    void slot_onSetTimeSpeed(QAction *action);
    void on_MediaSpeedBtn_clicked();

    void on_pushButton_get_state_clicked();

    void on_pushButton_reset_clicked();
    void on_pushButton_volume_clicked();

    void on_horizontalSlider_volume_valueChanged(int value);

protected:
    bool eventFilter(QObject *obj, QEvent *event);
    static void vlcEvents(const libvlc_event_t *ev, void *param);
private:
    Ui::Widget *ui;

    libvlc_instance_t *vlc_base=nullptr;
    libvlc_media_t *vlc_media=nullptr;
    libvlc_media_player_t *vlc_mediaPlayer=nullptr;

    QActionGroup *m_TimeSpeedGrp;
    QMenu		m_SpeedMenu;

    static Widget *pThis;
};
#endif // WIDGET_H

3.6 编译之后, 拷贝运行需要的文件

编译完成之后,将plugins目录、libvlc.dll、libvlccore.dll文件拷贝到exe同级目录下,再去QtCreate里运行测试。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QT应用编程:基于VLC开发音视频播放器(回调方式)
完整项目代码下载地址: https://download.csdn.net/download/xiaolong1126626497/16579867
DS小龙哥
2022/01/07
1.3K0
QT应用编程:基于VLC开发音视频播放器(回调方式)
QT软件开发:基于libVLC内核设计视频播放器
完整工程下载地址(下载即可编译运行): VLC_Core_VideoPlayer.zip-QT文档类资源-CSDN下载
DS小龙哥
2022/01/12
3.4K2
QT软件开发:基于libVLC内核设计视频播放器
QT应用编程:基于QMediaPlayer开发音视频播放器
QMediaPlayer是Qt提供的一个跨平台媒体播放器类,它没有自带解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API。所以使用QMediaPlayer播放视频,需要提前安装解码库。 在win系统下可以下载K-Lite_Codec_Pack或者LAVFilters解码库安装。
DS小龙哥
2022/01/07
3.6K0
QT应用编程:基于QMediaPlayer开发音视频播放器
采用libvlc做一个视频播放器(续)-注册事件回调
在前面文章里已经介绍过,如何调用libvlc提供的API快速开发一款简单的视频播放器(https://juejin.cn/post/7023552394798006279) 这篇文章继续完善视频播放器的基本功能。 增加播放进度条、播放时间进度显示、实时获取播放过程中的状态等等。
DS小龙哥
2024/05/24
4430
采用libvlc做一个视频播放器(续)-注册事件回调
QT应用编程: 基于mdk-sdk开发视频播放器
github 首页地址: https://github.com/wang-bin/mdk-sdk
DS小龙哥
2022/01/07
2.4K0
QT应用编程:  基于mdk-sdk开发视频播放器
QT软件开发:基于QtAV设计的视频播放器
完整源码下载: https://download.csdn.net/download/xiaolong1126626497/19759245
DS小龙哥
2022/01/12
1.7K0
QT软件开发:基于QtAV设计的视频播放器
QT软件开发: 基于QT设计的完整版视频播放器、多媒体播放器(mdk-sdk)
完整工程源码下载地址(下载即可编译运行): https://download.csdn.net/download/xiaolong1126626497/19387165
DS小龙哥
2022/01/12
7.4K0
QT软件开发:  基于QT设计的完整版视频播放器、多媒体播放器(mdk-sdk)
采用libvlc做一个视频播放器
VLC这个播放器(只要涉及到软件开发)基本应该都听过用过,其功能的强大就不多说了。 VLC媒体播放器官网: https://www.videolan.org/
DS小龙哥
2024/05/24
1.1K0
采用libvlc做一个视频播放器
QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)
QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537
DS小龙哥
2023/01/30
2.5K1
QT软件开发: 基于FFMPGE设计的流媒体播放器(rtmp/rtsp)
完整工程下载地址(下载即可编译运行): ffmpeg流媒体播放器.zip_qt流媒体播放器-直播技术文档类资源-CSDN下载
DS小龙哥
2022/01/12
3.3K0
QT软件开发: 基于FFMPGE设计的流媒体播放器(rtmp/rtsp)
FFMPEG音频视频开发: 开发本地视频播放器(单线程解码)
ffmpeg与x264源码开源,可以在任意平台上编译。自行下载源码编译得到库文件即可。
DS小龙哥
2022/01/12
1.5K0
FFMPEG音频视频开发: 开发本地视频播放器(单线程解码)
QT入门10个小demo——MP4视频播放器
学完qt好几个月了,一直没做相关的项目巩固,这次分享10个qt相关的小项目来练练手。
秋名山码神
2023/10/16
2.6K0
QT入门10个小demo——MP4视频播放器
【QT】Qt 音视频
在 Qt 中,音频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只支持播放 wav 格式的音频文件。也就是说如果想要添加音频效果,那么首先需要将非 wav 格式的音频文件转换为 wav 格式。
YoungMLet
2024/08/13
1980
【QT】Qt 音视频
QT应用编程: 基于FFMPEG设计的精简版视频播放器
win32下使用FFMPEG 4.2.2库下载地址:https://download.csdn.net/download/xiaolong1126626497/12321684
DS小龙哥
2022/01/07
8730
QT应用编程: 基于FFMPEG设计的精简版视频播放器
QT软件开发: 点击鼠标在窗口里绘制矩形(窗口透明背景)
工程下载地址: https://download.csdn.net/download/xiaolong1126626497/21043499
DS小龙哥
2022/01/12
2.2K0
QT软件开发: 点击鼠标在窗口里绘制矩形(窗口透明背景)
Qt | windows视频播放器小项目
点击ctrl+r 运行 目前我测试了gif和MP4,其他文件应该也可以,留给大家完成。
Qt历险记
2024/10/28
3760
Qt | windows视频播放器小项目
QT应用编程: QGraphicsView绘制图片作为背景
使用指定的图片作为QGraphicsView视图窗口的背景,并消除图元拖动时产生的残影。 思路: 派生QGraphicsScene类,重写drawBackground函数。
DS小龙哥
2022/01/07
2.8K0
QT应用编程: QGraphicsView绘制图片作为背景
视频播放器:QtCreator运行VLC-Qt官方示例代码
它包含了用于媒体播放的核心类,以及用于更快速地进行媒体播放器开发的一些 GUI 类。
DS小龙哥
2022/01/12
2.7K0
视频播放器:QtCreator运行VLC-Qt官方示例代码
QT应用编程:基于QT+HTTP协议设计的屏幕共享软件(只要有浏览器就可以访问)
QT版本: 5.12.6 操作系统: win10 64位 软件下载地址 完整源码下载:https://download.csdn.net/download/xiaolong1126626497/19354865
DS小龙哥
2022/01/07
2.1K0
QT应用编程:基于QT+HTTP协议设计的屏幕共享软件(只要有浏览器就可以访问)
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
QGraphicsView+QGraphicsTextItem 实现在画布上动态输入,编辑文本。 类似于截图软件、图片编辑器加文字水印的效果。 比如: 类似于windows系统自带的图片编辑器这个效果。
DS小龙哥
2022/01/07
3.5K1
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
推荐阅读
相关推荐
QT应用编程:基于VLC开发音视频播放器(回调方式)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档