QT 创建一个线程播放监控视频
1.创建一个线程类(PlayVideoThread):
PlayVideoThread.h头文件
#pragma once #include <QObject>
#include "DataDefine.h"
#include "hi_sdk_api.h" class PlayVideoThread : public QObject
{
Q_OBJECT public:
PlayVideoThread();
~PlayVideoThread();
void setParam(VIDEO_CHANNEL ch, int win); public slots:
void doWork(); signals:
void sglOnMessage(VIDEO_STATUS_EVENT event, QString msg); signals:
void sglSendHandle(HI_HANDLE loginHandle, HI_S32 play); private:
VIDEO_CHANNEL m_Ch;
int m_Win; HI_HANDLE m_lLoginHandle;
HI_S32 m_lPlay;
};
PlayVideoThread.cpp源文件
#include "PlayVideoThread.h" PlayVideoThread::PlayVideoThread()
{
} PlayVideoThread::~PlayVideoThread()
{
} void PlayVideoThread::setParam(VIDEO_CHANNEL ch, int win)
{
m_Ch = ch;
m_Win = win;
} void PlayVideoThread::doWork()
{
HI_S32 err; /* 成功将返回 HI_HANDLE 句柄,失败返回 0 */
m_lLoginHandle = HI_SDK_Login(m_Ch.device.ip.toStdString().c_str(), m_Ch.device.user.toStdString().c_str(), m_Ch.device.password.toStdString().c_str(), m_Ch.device.port, &err); emit sglOnMessage(m_lLoginHandle == ? E_LOGIN_FAILURE : E_LOGIN_SUCCESS, "login err");
emit sglOnMessage(E_DEBUG_LOG, m_lLoginHandle == ? "login err" : "login success"); HI_S_STREAM_INFO info;
info.u32Channel = HI_CHANNEL_1;
info.blFlag = HI_TRUE;
info.u32Mode = HI_STREAM_MODE_TCP;
info.u8Type = HI_STREAM_ALL; /* 成功返回 #define HI_SUCCESS 0 ,失败返回错误代码。*/
m_lPlay = HI_SDK_RealPlay(m_lLoginHandle, (HI_VOID*)m_Win, &info); emit sglOnMessage(m_lPlay != ? E_REALPLAY_FAILURE : E_REALPLAY_SUCCESS, "play err");
emit sglOnMessage(E_DEBUG_LOG, m_lPlay == ? "play err" : "play success"); //登录并播放成功后发送句柄
emit sglSendHandle(m_lLoginHandle, m_lPlay);
}
2.调用这个线程类:
LZYVideo.h头文件
#pragma once #include <BaseVideo.h>
#include "PlayVideoThread.h"
#include "hi_sdk_api.h"
#include <QThread> class LZYVideo : public BaseVideo
{
Q_OBJECT public:
LZYVideo(QObject *parent=);
~LZYVideo();
int startRealPlay(VIDEO_CHANNEL ch, int win) ;
int stopRealPlay() ;private:
HI_HANDLE m_lLoginHandle;
HI_S32 m_lPlay; VIDEO_CHANNEL m_VideoChannel; PlayVideoThread* m_pPlayWorker;
QThread* m_pPlayWorkerThread; private:
void createThreadForPlayVideo(VIDEO_CHANNEL ch, int win);
void destroyThreadForPlayVideo(); private slots:
void sltGetHandle(HI_HANDLE loginHandle, HI_S32 play);
};
LZYVideo.cpp源文件
#include "LZYVideo.h" void LZYVideo::createThreadForPlayVideo(VIDEO_CHANNEL ch, int win) //创建线程
{
destroyThreadForPlayVideo();
m_pPlayWorker = new PlayVideoThread;
m_pPlayWorker->setParam(ch, win);
m_pPlayWorkerThread = new QThread(this);
m_pPlayWorker->moveToThread(m_pPlayWorkerThread);
connect(m_pPlayWorkerThread, SIGNAL(finished()), m_pPlayWorkerThread, SLOT(deleteLater()));
connect(m_pPlayWorkerThread, SIGNAL(finished()), m_pPlayWorker, SLOT(deleteLater()));
connect(m_pPlayWorkerThread, SIGNAL(started()), m_pPlayWorker, SLOT(doWork())); connect(m_pPlayWorker, SIGNAL(sglOnMessage(VIDEO_STATUS_EVENT, QString)), this, SIGNAL(sglOnMessage(VIDEO_STATUS_EVENT, QString)));
connect(m_pPlayWorker, SIGNAL(sglSendHandle(HI_HANDLE, HI_S32)), this, SLOT(sltGetHandle(HI_HANDLE, HI_S32))); m_pPlayWorkerThread->start();
} void LZYVideo::destroyThreadForPlayVideo()
{
if (m_pPlayWorkerThread && m_pPlayWorkerThread->isRunning())
{
m_pPlayWorkerThread->exit();
m_pPlayWorkerThread->wait();
m_pPlayWorkerThread->deleteLater();
m_pPlayWorkerThread = NULL;
}
} int LZYVideo::startRealPlay(VIDEO_CHANNEL ch, int win)
{
m_VideoChannel = ch; stopRealPlay(); createThreadForPlayVideo(ch, win); //创建一个线程播放视频 return ;
} void LZYVideo::sltGetHandle(HI_HANDLE loginHandle, HI_S32 play)
{
m_lLoginHandle = loginHandle;
m_lPlay = play; destroyThreadForPlayVideo();
}
插入的代码框都不能删掉。。。服了
QT 创建一个线程播放监控视频的更多相关文章
- 前端Web浏览器基于Flash如何实时播放监控视频画面(四)之使用videoJs‘拉流’
本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 下载videoJs 对于Video.js 5.x及更低版本,Flash技术(v ...
- 创建一个实例&创建一个线程。。
using System; using System.Threading; namespace WorkerThread02 { class ThreadTest { bool done; stati ...
- python创建一个线程和一个线程池
创建一个线程 1.示例代码 import time import threading def task(arg): time.sleep(2) while True: num = input('> ...
- 前端Web浏览器基于Flash如何实时播放监控视频画面(前言)之流程介绍
[关键字:前端浏览器如何播放RTSP流画面.前端浏览器如何播放RTMP流画面] 本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 考虑到视频延 ...
- Qt编写的RTSP播放器+视频监控(vlc版本)
几天写了个ffmpeg版本,今天特意抽空改写个vlc版本,之前vlc播放视频后,被接管了不能识别到鼠标,需要重新编译vlc源码得到支持鼠标消息的版本. /*** vlc视频播放类 作者:feiyang ...
- Qt编写的RTSP播放器+视频监控(ffmpeg版本)
记得四年前就写了个简易版本的,当时写得非常粗糙,代码实在惨不忍睹,时隔多年后,重新写了个版本,同时还解决了以前不支持6画面8画面切换等异形布局的问题.1:可以用过目录下的rtsp.txt设置要显示的视 ...
- 前端Web浏览器基于Flash如何实时播放监控视频画面(三)之使用ffmpeg‘推流’
本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 下载ffmpeg 开源免费的推流软件有很多,这里以 ffmpeg 为例.ffm ...
- [转]使用VC/MFC创建一个线程池
许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...
- java多线程学习(两)——创建一个线程
一个.java创建两个线程的方法 1.从java.lang.Thread派生一个新类线程类,其覆盖run()方法 2.实现Runnable接口.重载Runnable接口中的run()方法. 使用Thr ...
随机推荐
- Linux-IIC驱动(详解)
IIC接口下的24C02 驱动分析: http://www.cnblogs.com/lifexy/p/7793686.html 接下来本节, 学习Linux下如何利用linux下I2C驱动体系结构来操 ...
- layui select 下拉框 级联 动态赋值 与获取选中值
//下拉框必须在 class="layui-form" 里 不然监听事件没有作用 <div class="layui-form" > <div ...
- js 解析 JSON 数据
JSON 数据如下: { "name": "mkyong", , "address": { "streetAddress" ...
- System.Net.WebRequest.cs
ylbtech-System.Net.WebRequest.cs 发出对统一资源标识符(URI)的请求.这是一个 abstract 类. 1.返回顶部 1. #region 程序集 System, V ...
- Flutter生命周期
生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情, flutter中的State生命周期和android以及React Native的生命周期类似. 大致可以分为 ...
- vue 日历组件
Github 上很多点击弹出日历选择某个时间的组件,却没有找到单纯展示日历并且能点击获取时间的组件 npm i vue-calendar-component --save cnpm i vue-cal ...
- postgresql 利用pgAgent实现定时器任务
1.安装pgAgent 利用Application Stack Builder安装向导,安装pgAgent. 根据安装向导一步一步安装即可. 安装完成之后,windows服务列表中会增加一个服务:Po ...
- pytorch模型存储的两种方式
1.保存整个网络结构信息和模型参数信息: torch.save(model_object, './model.pth') 直接加载即可使用: model = torch.load('./model.p ...
- 阿里云服务器Svn-Server无法连接
总结:关于阿里云服务器Svn-Server无法连接,Svn-Server的配置问题 2018年07月09日 11:51:08 周同学的博客 阅读数:355 最近在使用阿里云服务器时,SQL SER ...
- Fiddler抓包显示请求时延
两种方式:配置和加代码.配置只是将隐藏的时延字段显现了出来,格式没法改:加代码就随你写了,格式自己说了算. 先说配置的,在左边框顶部字段名称右击鼠标 -> 点击Customize colums. ...