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 创建一个线程播放监控视频的更多相关文章

  1. 前端Web浏览器基于Flash如何实时播放监控视频画面(四)之使用videoJs‘拉流’

    本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 下载videoJs 对于Video.js 5.x及更低版本,Flash技术(v ...

  2. 创建一个实例&创建一个线程。。

    using System; using System.Threading; namespace WorkerThread02 { class ThreadTest { bool done; stati ...

  3. python创建一个线程和一个线程池

    创建一个线程 1.示例代码 import time import threading def task(arg): time.sleep(2) while True: num = input('> ...

  4. 前端Web浏览器基于Flash如何实时播放监控视频画面(前言)之流程介绍

    [关键字:前端浏览器如何播放RTSP流画面.前端浏览器如何播放RTMP流画面] 本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 考虑到视频延 ...

  5. Qt编写的RTSP播放器+视频监控(vlc版本)

    几天写了个ffmpeg版本,今天特意抽空改写个vlc版本,之前vlc播放视频后,被接管了不能识别到鼠标,需要重新编译vlc源码得到支持鼠标消息的版本. /*** vlc视频播放类 作者:feiyang ...

  6. Qt编写的RTSP播放器+视频监控(ffmpeg版本)

    记得四年前就写了个简易版本的,当时写得非常粗糙,代码实在惨不忍睹,时隔多年后,重新写了个版本,同时还解决了以前不支持6画面8画面切换等异形布局的问题.1:可以用过目录下的rtsp.txt设置要显示的视 ...

  7. 前端Web浏览器基于Flash如何实时播放监控视频画面(三)之使用ffmpeg‘推流’

    本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 下载ffmpeg 开源免费的推流软件有很多,这里以 ffmpeg 为例.ffm ...

  8. [转]使用VC/MFC创建一个线程池

    许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...

  9. java多线程学习(两)——创建一个线程

    一个.java创建两个线程的方法 1.从java.lang.Thread派生一个新类线程类,其覆盖run()方法 2.实现Runnable接口.重载Runnable接口中的run()方法. 使用Thr ...

随机推荐

  1. 用vue做todolist

    <template> <div class="hello"> <div style="height:25px;line-height:25p ...

  2. LeetCode 第 155 场周赛

    一.最小绝对差(LeetCode-5189) 1.1 题目描述 1.2 解题思路 数组排好序,获取最小的差值即可. 1.3 解题代码 public class Solution { class Tes ...

  3. JavaWeb之问题集(1) —— Tomcat启动闪退

    1. 问题描述 环境: System:Windows 10 Professional JDK:1.8.0.212 Tomcat:9.0.22 原本可以正常的启动和关闭,后来突然的就无法使用了,无法启动 ...

  4. 2019-2020-1 20175313 《信息安全系统设计基础》实现mypwd

    目录 MyPWD 一.题目要求 二.题目理解 三.需求分析 四.设计思路 五.伪代码分析 六.码云链接 七.运行结果截图 MyPWD 一.题目要求 学习pwd命令 研究pwd实现需要的系统调用(man ...

  5. mysql 替换函数replace()实现mysql替换指定字段中的字符串

    mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便. mysql 替换函数replace() ...

  6. css3的选择器有哪几种?

    *通用选择器,ID选择器 ,.类选择器class,标签选择器,标签组合选择器,伪类选择器:,+相邻元素选择器,>子元素选择器,~同辈选择器,x[title]属性选择器[type="bu ...

  7. 多层nginx中的压缩问题 api接口>1M数据的返回浏览器 网关

    基础 前端异步请求,局部刷新,加大最大等待时间 nginx开启压缩 进阶 多级nginx的压缩 实践测试: 每级都要开启压缩 gizp on: 最外层开启,但最内层没有开启 最外层没有开启 最外层.最 ...

  8. layui表格工具条,如何动态控制按钮的展示?

    <script type="text/html" id="toolTpl"> {{# if(d.agrgrtsts == 'A'){ }} < ...

  9. springboot rabbitMQ 死信对列 实现消息的可靠消费

    1 引入 maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  10. [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件

    参考: osgPlugins相关 osg读取文件的原理(插件工作机制) 当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现. 比如: osgviewer cow.o ...