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. kubernetes入门学习系列

    一.kubernetes基础概念 初识kubernetes kubernetes相关概念 二.kubernets架构和组件 kubernetes架构 kubernetes单Master架构 kuber ...

  2. Spring boot Security 登陆安全配置

    实现的效果 访问url时,如果未登录时跳转到Login界面,要求用户登陆,如果登陆过返回请求的数据. 效果图 访问数据时,未登录返回login界面 登陆操作 登陆成功进入登出界面 登陆成功后再次访问数 ...

  3. shell - 拉取代码部署执行

    #!/bin/bash nodejs_path=/data/myserver/yihao01-node-js cd /data/myserver if [ -d "$nodejs_path& ...

  4. git 删除远程和本地分支

    RenGuoQiang@PC-RENGUOQIANG MINGW64 /d/zgg/zgg-crm (dev-rgq-userworkstatus) $ git push origin --delet ...

  5. maven项目新检出后不编译爬坑记 及 mvn clean package报错 WagonTransporterFactory: java.util.NoSuchElementException 异常【我】

    从SVN新检出一个maven项目,配置好后,发现项目无法编译(只有一个test包中的代码显示编译报错,其他所有包中的代码都不编译,也不报错), 先注释掉报错的test包中的所有内容, 用Eclipse ...

  6. 安装docker报错:https://download.docker.com/linux/centos/7/i386/stable/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"

    如题,执行docker安装命令报错: [root@centos ~]# yum install docker-ce Loaded plugins: fastestmirror, security Se ...

  7. 泡泡一分钟:eRTIS - A Fully Embedded Real Time 3D Imaging Sonar Sensor for Robotic Applications

    eRTIS - A Fully Embedded Real Time 3D Imaging Sonar Sensor for Robotic Applications eRTIS  - 用于机器人应用 ...

  8. 全面系统Python3入门+进阶-1-8 Python的前景

    语言的热度. python在开发效率上有优势 大数据.人工智能 结束

  9. 了解有后门的sshd服务是如何劫持密码的

    在服务器上安装一个打了后门补丁的sshd服务,当用户连接时,直接把密码记录下来,然后使用脚本发送到邮箱中. (1).实验环境 使用CentOS6.2作为系统环境,查看sshd和gcc的版本 [root ...

  10. lombok插件/slf4j中字符串格式化

    大家在编写springboot项目的过程中可能会接触到lombok这个插件,这个插件可以在编译时帮我生成很多代码. 1.@Data生成Getter和Setter代码,用于类名注释 2.@Getter ...