Qt下調(diào)用vlc庫實現(xiàn)RTSP拉流播放和截圖過程詳解
1、介紹
使用VLC-Qt庫實現(xiàn)拉流播放器基本功能,包括拉流、播放、暫停、截圖等功能。
VLC-Qt庫:一個對libVLC庫基礎(chǔ)上封裝的開源庫;
推拉流服務(wù)器:ZLMediaKitde的MediaServer;
推流工具:ffmpeg
VLC-Qt官網(wǎng): VLC-Qt (tano.si)
Github地址:VLC-Qt (github.com)
2、下載/配置VLC-Qt庫
進入VLC-Qt官網(wǎng),按照自己的編譯環(huán)境,下載對應(yīng)的庫和頭文件,也可以去github倉庫下載源碼自己編譯

我這里用的是MSVC64位,下載后庫包括動態(tài)庫、靜態(tài)庫和頭文件

新建一個Qt的工程,添加第三方庫,或直接在pro文件中配置以下:
LIBS += -L$$PWD/libVLC/lib/ -lVLCQtCore -lVLCQtWidgets INCLUDEPATH += $$PWD/libVLC/include DEPENDPATH += $$PWD/libVLC/include
3、設(shè)置視頻播放控件
因為在libvlc中需要自己獲取控件的HWND句柄,并將播放綁定在控件句柄上,VLC-Qt直接封裝了這個函數(shù)并直接賦值控件,不過控件需要升級到VlcWidgetVideo的類。
我們再ui上選擇一個widget的控件,右鍵升級

4、主要實現(xiàn)代碼
在main中要設(shè)置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_Hwidget.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("繼續(xù)");
}
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下調(diào)用vlc庫實現(xiàn)RTSP拉流播放和截圖過程詳解的詳細內(nèi)容,更多關(guān)于Qt調(diào)用vlc庫 RTSP拉流播放截圖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值)
這篇文章主要介紹了C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
養(yǎng)成良好的C++編程習慣之內(nèi)存管理的應(yīng)用詳解
"養(yǎng)成良好的編程習慣"其實是相當綜合的一個命題,可以從多個角度、維度和層次進行論述和評判,如代碼的風格、效率和可讀性;模塊設(shè)計的靈活性、可擴展性和耦合度等等,要試圖把所有方面都闡述清楚必須花很多的精力,而且也不一定能闡述得全面2013-05-05
C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別
拷貝構(gòu)造函數(shù)和賦值函數(shù)非常容易混淆,本文主要介紹了C++?拷貝構(gòu)造函數(shù)與賦值的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-04-04

