开发环境: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;
}
}