Qt下调用vlc库实现RTSP拉流播放和截图过程详解

 更新时间:2023年08月24日 10:28:13   作者:coder_Alaric  
这篇文章主要为大家介绍了Qt下调用vlc库实现RTSP拉流播放和截图过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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、效果展示

源码 https://gitee.com/Damion_Learning/QtHalcon_LearningRecord/tree/master/printTest

以上就是Qt下调用vlc库实现RTSP拉流播放和截图过程详解的详细内容,更多关于Qt调用vlc库 RTSP拉流播放截图的资料请关注脚本之家其它相关文章!

相关文章

  • C++左值和右值学习笔记

    C++左值和右值学习笔记

    这篇文章主要为大家介绍了C++左值和右值学习笔记的重点讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C++ 压缩文件及文件夹方法 使用zlib开源库

    C++ 压缩文件及文件夹方法 使用zlib开源库

    下面小编就为大家分享一篇C++ 压缩文件及文件夹方法 使用zlib开源库,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • C++共享智能指针shared_ptr的实现

    C++共享智能指针shared_ptr的实现

    在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露,解决这个问题最有效的方法是使用智能指针,本文主要介绍了C++共享智能指针shared_ptr的实现,感兴趣的可以了解一下
    2023-12-12
  • C++实现LeetCode(162.求数组的局部峰值)

    C++实现LeetCode(162.求数组的局部峰值)

    这篇文章主要介绍了C++实现LeetCode(162.求数组的局部峰值),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 养成良好的C++编程习惯之内存管理的应用详解

    养成良好的C++编程习惯之内存管理的应用详解

    "养成良好的编程习惯"其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判,如代码的风格、效率和可读性;模块设计的灵活性、可扩展性和耦合度等等,要试图把所有方面都阐述清楚必须花很多的精力,而且也不一定能阐述得全面
    2013-05-05
  • C++ 拷贝构造函数与赋值的区别

    C++ 拷贝构造函数与赋值的区别

    拷贝构造函数和赋值函数非常容易混淆,本文主要介绍了C++ 拷贝构造函数与赋值的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • C语言练习之扫雷小游戏

    C语言练习之扫雷小游戏

    这篇文章主要为大家详细介绍了C语言练习之扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++基于prim实现迷宫生成

    C++基于prim实现迷宫生成

    这篇文章主要为大家详细介绍了C++基于prim实现迷宫生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C语言 超详细讲解链接器

    C语言 超详细讲解链接器

    在C语言中,一个重要的思想就是分别编译,即若干个源程序能够在不一样的时候单独进行编译,而后在恰当的时候整合到一块儿。可是链接器通常是与C编译器分离的,链接器如何作到把若干个C源程序合并成一个总体呢,我们一起来看看
    2022-03-03
  • C语言for语句用法详解

    C语言for语句用法详解

    今天,小编讲诉C语言中循环语句(for)的使用方法,作为示例,以一个简单的例子讲诉for语法。
    2015-11-11

最新评论