QT接入播放摄像头RTSP流
- 如果想直接用源码工程,到这里下载
https://download.csdn.net/download/quantum7/89730058
- 安装QT环境
略
- 下载VLC SDK文件
这里并不是调用安装的VLC,所以需要下载SDK。
所有版本:
https://download.videolan.org/pub/videolan/vlc/
最新版:
https://download.videolan.org/pub/videolan/vlc/last/
注意要下载后缀是7z的文件。
- 需要的文件
sdk:编译需要的头文件和库文件。
plugs/libvlc.dll/libvlccore.dll:运行需要的文件。
- 修改pro文件
INCLUDEPATH += $$PWD\sdk\include LIBS += $$PWD\sdk\lib\libvlc.lib \ $$PWD\sdk\lib\libvlccore.libmainwindow.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> #include <vlc/libvlc_media.h> 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); libvlc_media_add_option(media, ":network-caching=300") 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; }