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 -lVLCQtWidgetsINCLUDEPATH += $$PWD/libVLC/includeDEPENDPATH += $$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_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{    Q_OBJECTpublic:    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、成果展现


源码仓库
)