QT 使用Vlc API实现简易播放器

开发环境:MinGw730+QT5.14.2+Vlc3.0.17

资源下载地址:

https://download.csdn.net/download/a3029537/87747273

一、开发环境搭建

(1) 下载libvlc

Index of /pub/videolan/vlc/3.0.17/win64/

(2)添加库

在qt工程目录底下新建vlc目录,将vlc-3.0.17\sdk的inlude、lib文件夹及内容拷贝到vlc底下

在新建的QT工程的pro文件添加lib目录及lib目录。

INCLUDEPATH += ./vlc/include
LIBS += $$PWD/vlc/lib/libvlc.lib
LIBS += $$PWD/vlc/lib/libvlccore.lib

将vlc-3.0.17底下的plugins文件夹、libvlc.dll、libvlccore.dll拷贝到qt生成的exe目录底下。

二、实现播放功能

(1) 创建CVlcPlayWidget,包含播放区域、播放文件路径输入,播放按钮

#include "vlcplaywidget.h"
#include "CqCommon.h"
#include <QDebug>

CVlcPlayWidget::CVlcPlayWidget(QWidget *parent)
    : QWidget(parent)
{
    setAutoFillBackground(true);
    setPalette(QPalette(QColor(0, 255, 255)));
    m_pVBoxLayout = new QVBoxLayout(this);
    m_pVBoxLayout->setObjectName(QString::fromUtf8("verticalLayout"));
    m_pVlcWidget = new QWidget();
    m_pVBoxLayout->addWidget(m_pVlcWidget);

    m_pHBoxLayout = new QHBoxLayout();
    m_pHBoxLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
    m_pMediaPath = new QLineEdit(this);
    m_pMediaPath->setObjectName(QString::fromUtf8("lineEdit"));
    m_pHBoxLayout->addWidget(m_pMediaPath);
    m_pPlayBtn = new QPushButton(tr("play"), this);
    m_pPlayBtn->setObjectName(QString::fromUtf8("pushButton"));
    m_pHBoxLayout->addWidget(m_pPlayBtn);

    m_pVBoxLayout->addLayout(m_pHBoxLayout);
    connect(m_pPlayBtn, SIGNAL(clicked()), this, SLOT(play()));
    initVlc();
}

CVlcPlayWidget::~CVlcPlayWidget()
{
    SAFE_DELETE(m_pVBoxLayout);
    SAFE_DELETE(m_pHBoxLayout);
    SAFE_DELETE(m_pVlcWidget);
    SAFE_DELETE(m_pMediaPath);
    SAFE_DELETE(m_pPlayBtn);
    unInitVlc();
}

/******************************************************************************
** 调用vlc播放
** 获取视频文件名进行播放
******************************************************************************/
void CVlcPlayWidget::play()
{
    if (m_pMediaPath == Q_NULLPTR)
    {
        return;
    }
    QString strMediaFile(m_pMediaPath->text());
    if (strMediaFile.isEmpty())
    {
        return;
    }

    while (libvlc_media_player_is_playing(m_pLibMp) == 1)
    {
        CQ_DEBUG() << "VideoLabelManage: is playing";
        libvlc_media_player_stop(m_pLibMp);
        CqCommon::sleep(1);
    }
    libvlc_media_t *pLibvlcM = libvlc_media_new_path(m_pLibInst, strMediaFile.toStdString().c_str());
    libvlc_media_player_set_media(m_pLibMp, pLibvlcM);
    libvlc_media_release(pLibvlcM);
    libvlc_media_player_play(m_pLibMp);
}

/******************************************************************************
** 初始化Vlc
******************************************************************************/
void CVlcPlayWidget::initVlc()
{
    const char *szVlcArgs[] = {"--ignore-config",
                               "--network-caching=500",
                              "--verbose=0"};
                               //"--longhelp",
                               //"--advanced"};
    m_pLibInst = libvlc_new(sizeof(szVlcArgs) / sizeof(szVlcArgs[0]), szVlcArgs);
    m_pLibMp = libvlc_media_player_new(m_pLibInst);
    libvlc_media_player_set_hwnd(m_pLibMp, reinterpret_cast<void *>(m_pVlcWidget->winId()));
    // libvlc忽略鼠标及键盘消息,由QWidget处理
    libvlc_video_set_mouse_input(m_pLibMp, 0);
    libvlc_video_set_key_input(m_pLibMp, 0);
    // libvlc_video_set_scale(m_pLibvlcMp, 0.0f);
    libvlc_video_set_aspect_ratio(m_pLibMp, "16:9");
}

/******************************************************************************
** 去初始化Vlc
******************************************************************************/
void CVlcPlayWidget::unInitVlc()
{
    if (m_pLibMp != Q_NULLPTR)
    {
        while (libvlc_media_player_is_playing(m_pLibMp) == 1)
        {
            libvlc_media_player_stop(m_pLibMp);
            CqCommon::sleep(1);
        }
        libvlc_media_player_release(m_pLibMp);
        m_pLibMp = Q_NULLPTR;
    }

    if (m_pLibInst != Q_NULLPTR)
    {
        libvlc_release(m_pLibInst);
        m_pLibInst = Q_NULLPTR;
    }
}
 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值