QT接入播放摄像头RTSP流
- 如果想直接用源码工程,到这里下载
https://download.csdn.net/download/quantum7/89730058
- 安装QT环境
略
- 下载VLC SDK文件
这里并不是调用安装的VLC,所以需要下载SDK。
Index of /pub/videolan/vlc
这里建议使用最新的:
Index of /pub/videolan/vlc/last/win64
注意要下载后缀是7z的文件。
- 需要的文件
sdk:编译需要的头文件和库文件。
plugs/libvlc.dll/libvlccore.dll:运行需要的文件。
- 修改pro文件
INCLUDEPATH += $$PWD\sdk\include
LIBS += $$PWD\sdk\lib\libvlc.lib \
$$PWD\sdk\lib\libvlccore.lib
-
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <vlc/vlc.h>
#define RTSP_STREAM "rtsp://192.168.1.100/live"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void OpenRtspStream();
public:
void MediaShowWindow(libvlc_media_player_t*player);
void MediaPlayerPlay();
private:
Ui::MainWindow *ui;
libvlc_instance_t*m_instence;
libvlc_media_player_t*m_vlcplayer = nullptr;
bool is_playing = false;
int m_currentVolume;
};
#endif // MAINWINDOW_H
- mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化
ui->btn_play->setText("暂停");
ui->Slider_volume->setMaximum(100);
ui->Slider_volume->setValue(100);
m_instence = libvlc_new(0,nullptr);
if(m_instence == nullptr){
qDebug()<<"instence null";
}else{
qDebug()<<"ok...";
}
//选择文件
connect(ui->btn_open,&QPushButton::clicked,this,&MainWindow::OpenRtspStream);
//播放暂停
connect(ui->btn_play,&QPushButton::clicked,this,[=](){
if(m_vlcplayer == nullptr){
QMessageBox::warning(this,"无视频","请选择一个视频");
return;
}
if(is_playing){
libvlc_media_player_pause(m_vlcplayer);
ui->btn_play->setText("播放");
is_playing = false;
}else{
libvlc_media_player_play(m_vlcplayer);
ui->btn_play->setText("暂停");
is_playing = true;
}
});
//音量调节
connect(ui->Slider_volume,&QSlider::valueChanged,this,[=](int value){
if(m_vlcplayer != nullptr){
int volume = static_cast<int>(static_cast<float>(value) / ui->Slider_volume->maximum() * 100);
libvlc_audio_set_volume(m_vlcplayer, volume);
m_currentVolume = volume;
ui->statusbar->showMessage("音量为: " + QString::number(volume));
}
});
}
MainWindow::~MainWindow()
{
if(m_instence != nullptr){
libvlc_release(m_instence);
m_instence = nullptr;
}
delete ui;
}
void MainWindow::OpenRtspStream()
{
if(m_vlcplayer != nullptr){
libvlc_media_player_stop(m_vlcplayer);
libvlc_media_player_release(m_vlcplayer);
m_vlcplayer = nullptr;
}
libvlc_media_t* media = libvlc_media_new_location(m_instence, RTSP_STREAM);
m_vlcplayer = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);
//设置窗口句柄
MediaShowWindow(m_vlcplayer);
//播放
MediaPlayerPlay();
}
void MainWindow::MediaShowWindow(libvlc_media_player_t *player)
{
libvlc_media_player_set_hwnd(player,(void*)ui->widget_player->winId());
}
void MainWindow::MediaPlayerPlay()
{
if(m_vlcplayer == nullptr){
qDebug()<<"m_vlcplayer is null";
return;
}
libvlc_media_player_play(m_vlcplayer);
is_playing = true;
}