关于qt5:Qt学习笔记Qt下调用vlc库实现RTSP拉流播放和截图

4次阅读

共计 2201 个字符,预计需要花费 6 分钟才能阅读完成。

1、介绍

应用 VLC-Qt 库实现拉流播放器基本功能,包含拉流、播放、暂停、截图等性能。
VLC-Qt 库:一个对 libVLC 库根底上封装的开源库;
推拉流服务器:ZLMediaKitde 的 MediaServer;
推流工具:ffmpeg
VLC-Qt 官网:VLC-Qt (tano.si)
Github 地址:VLC-Qt (github.com)

2、下载 / 配置 VLC-Qt 库

进入 VLC-Qt 官网,依照本人的编译环境,下载对应的库和头文件,也能够去 github 仓库下载源码本人编译

我这里用的是 MSVC64 位,下载后库包含动静库、动态库和头文件

新建一个 Qt 的工程,增加第三方库,或间接在 pro 文件中配置以下:

LIBS += -L$$PWD/libVLC/lib/ -lVLCQtCore -lVLCQtWidgets

INCLUDEPATH += $$PWD/libVLC/include
DEPENDPATH += $$PWD/libVLC/include

3、设置视频播放控件

因为在 libvlc 中须要本人获取控件的 HWND 句柄,并将播放绑定在控件句柄上,VLC-Qt 间接封装了这个函数并间接赋值控件,不过控件须要降级到 VlcWidgetVideo 的类。
咱们再 ui 上抉择一个 widget 的控件,右键降级

4、次要实现代码

在 main 中要设置 Vlc 的 Plugin,次要是依赖的插件

#include "widget.h"
#include <QApplication>
#include "VLCQtCore/Common.h"

int main(int argc, char *argv[])
{QApplication a(argc, argv);
    VlcCommon::setPluginPath(a.applicationDirPath() + "/plugins");
    Widget w;
    w.show();
    return a.exec();}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "VLCQtCore/Common.h"
#include "VLCQtCore/Instance.h"
#include "VLCQtCore/Media.h"
#include "VLCQtCore/MediaPlayer.h"

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_btn_startPlay_clicked();


    void on_btn_pause_clicked(bool checked);

    void on_btn_stop_clicked();

    void on_btn_snap_clicked();

private:
    Ui::Widget *ui;

    VlcInstance * inst;
    VlcMediaPlayer *vlcPlayer;
    VlcMedia *vlcMedia;
};
#endif // WIDGET_H

widget.cpp

#pragma execution_character_set("utf-8")
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{ui->setupUi(this);
    ui->btn_snap->setEnabled(false);
    inst = new VlcInstance(VlcCommon::args(), this);
    vlcPlayer = new VlcMediaPlayer(inst);
    vlcPlayer->setVideoWidget(ui->widget_video);
}

Widget::~Widget()
{delete ui;}


void Widget::on_btn_startPlay_clicked()
{QString rtspUrl = ui->edt_rtspUrl->text();
    if(!rtspUrl.isEmpty())
    {vlcMedia = new VlcMedia(rtspUrl, inst);
        vlcPlayer->open(vlcMedia);
        ui->btn_snap->setEnabled(true);
    }
}

void Widget::on_btn_pause_clicked(bool checked)
{if(checked)
    {ui->btn_pause->setText("持续");
    }
    else
    {ui->btn_pause->setText("暂停");
    }
    vlcPlayer->togglePause();}


void Widget::on_btn_stop_clicked()
{vlcPlayer->stop();
    ui->btn_snap->setEnabled(false);
}


void Widget::on_btn_snap_clicked()
{emit vlcPlayer->snapshotTaken("E:/123.jpg");
}

5、成果展现

源码仓库
)

正文完
 0