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
#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
#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、效果展示
源码仓库
)