vs2015下 cmake编译 vlc-qt与使用

       最近使用vlc-qt做播放器,效果比较好,可以播放本地文件与rtmp流,特别rtmp流的播放,由于vlc库的延迟,可能会有2s左右的延迟

1   vlc库的下载,下载的vlc都不带sdk目录了,所以现在下来的安装文件不能用来开发,推荐地址http://download.videolan.org/pub/videolan/vlc/       推荐下载3.7.1版本的,之前下了个2.x的版本库有问题,导致编译出错(坑)

2  vlc-qt下载,vlc-qt是使用libvlc的库写了可以直接播放视频的widget,git地址https://github.com/vlc-qt/vlc-qt 

  下载:

   git clone git://github.com/vlc-qt/vlc-qt.git

   git submodule init

  git submodule update

3  使用cmake编译

在vlc-qt下新建build目录,用于cmake配置输出,

vs2015下 cmake编译 vlc-qt与使用

点击Config按钮,配置编译器

vs2015下 cmake编译 vlc-qt与使用

配置完成后点击finish,会自动config

如果没出错,恭喜,点击Generate Projection即可

我这里出错,

By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Qt5Core", but
CMake did not find one.

是找不到Qt5Core.lib 的cmake文件,可以手动指定

vs2015下 cmake编译 vlc-qt与使用

其他的lib也是一样,其中有libvlcCore与libvlc以及libvlc的 include目录要注意,在之前下载的vlc文件夹中,我的如下图

vs2015下 cmake编译 vlc-qt与使用

configure完成后,点击Generate,生成vs工程,生成完成后点击open project即可

vs2015下 cmake编译 vlc-qt与使用

打开工程,只需生成core与widgets模块即可

vs2015下 cmake编译 vlc-qt与使用

生成完成后,在buid/src/core 与buid/src/widgets下有生成的lib与dll,至此,vlc-qt编译完成,里面代码示例TestWidgetsPlayer也可以编译运行看一下,对于使用很有帮助,基本按照TestWidgetsPlayer示例即可,我编译好的分享给大家https://download.csdn.net/download/i7891090/11946361 

4 播放器编写

.h文件

#pragma once
#include <QWidget>
#include "ui_LocalPlayer.h"

class VlcInstance;
class VlcMedia;
class VlcMediaPlayer;

class LocalPlayer:public QWidget
{
    Q_OBJECT
public:
     explicit LocalPlayer(QWidget *parent = nullptr);
    ~LocalPlayer();
    void StartPlay(const  QString &strFile);

private:

private slots :
    void OnPlayEnd();
    void OnPauseClicked(bool);
    void OnSgnVideoPaused();
    void OnSgnVideoPlaying();
private:
    Ui::LocalPlayer *ui;
    VlcInstance *_instance;
    VlcMedia *_media;
    VlcMediaPlayer *_player;
    QString _strFileName;
};

.cpp文件

#include "VlcLocalPlayer.h"
#include <QDesktopWidget>
#include <QTcpSocket>
#include <QByteArray>


VlcLocalPlayer::VlcLocalPlayer(QWidget *parent)
    : QWidget(parent)
    , ui(nullptr)
    , m_backWdt(nullptr)
    , m_pisocket(nullptr)
{
    ui = new Ui::VlcLocalPlayerClass;
    ui->setupUi(this);
    m_backWdt = new QWidget;
    this->setWindowIcon(QIcon("./app.ico"));
    m_backWdt->setWindowIcon(QIcon("./app.ico"));
    //保存在最顶层
    setWindowFlags(this->windowFlags()|Qt::WindowStaysOnTopHint);
    InitServer(PORT);
}

VlcLocalPlayer::~VlcLocalPlayer()
{
    delete ui;
    m_svr.close();
    if (m_backWdt != nullptr)
    {
        delete m_backWdt;
        m_backWdt = nullptr;
    }
}

void VlcLocalPlayer::StartPlay(const QString & strFile)
{
    m_backWdt->show();
    m_backWdt->setGeometry(0,0,QApplication::desktop()->width(), QApplication::desktop()->height());
    m_backWdt->setWindowOpacity(0);
    if (!strFile.isEmpty())
    {
        ui->widget->StartPlay(strFile);
    }
}

void VlcLocalPlayer::OnCloseClicked()
{
    //this->close();
    m_backWdt->close();
}

void VlcLocalPlayer::closeEvent(QCloseEvent *event)
{
    m_backWdt->close();
    this->close();
}

bool VlcLocalPlayer::InitServer(int nPort)
{
    if (!m_svr.listen(QHostAddress::Any,nPort))
    {
        return false;
    }
    connect(&m_svr, SIGNAL(newConnection()), this, SLOT(newClientConnect()));
    return true;
}

void VlcLocalPlayer::newClientConnect()
{
    m_pisocket = m_svr.nextPendingConnection();
    bool ret = connect(m_pisocket,SIGNAL(readyRead()),this,SLOT(OnSocketReadyRead()));
    ret =  connect(m_pisocket,SIGNAL(disconnect()),this,SLOT(OnScokDisconnect()));
    m_pisocket->waitForReadyRead();
}

void VlcLocalPlayer::OnSocketReadyRead()
{
    QByteArray buf;
    buf = m_pisocket->readAll();
    qDebug() << buf;
    if (buf == "close")
    {
        m_svr.close();
        m_backWdt->close();
        this->close();
    }
}

void VlcLocalPlayer::OnScokDisconnect()
{
    //TODO
}

源码分享给大家https://download.csdn.net/download/i7891090/11946474