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. springcloud config自动刷新中文乱码问题

    摘录一段网上盛传的,如下: 在使用 spring cloud config 时,如果在 properties 文件里面有中文的话,会出现乱码. 乱码的原因是:spring 默认使用org.spring ...

  2. 范仁义web前端介绍课程---4、html、css、js初体验

    范仁义web前端介绍课程---4.html.css.js初体验 一.总结 一句话总结: html:就是网站的骨架,比如div标签.a标签等 css:style标签或者style属性里面的就是css j ...

  3. Python将多张图片进行合并拼接

    import PIL.Image as Image import os IMAGES_PATH = r'D:\pics22223\\' # 图片集地址 IMAGES_FORMAT = ['.jpg', ...

  4. cmake 手册详解【转】

    https://www.cnblogs.com/coderfenghc/tag/cmake/   CMake 手册详解(二十三) SirDigit 2012-12-16 22:03 阅读:11058 ...

  5. 【Tomcat】本地域名访问配置

    原路径:localhost:8080/jsja 1.把8080端口改为80端口 打开%TOMCAT_HOME%/conf/server.xml <Connector connectionTime ...

  6. Spark(四十九):Spark On YARN启动流程源码分析(一)

    引导: 该篇章主要讲解执行spark-submit.sh提交到将任务提交给Yarn阶段代码分析. spark-submit的入口函数 一般提交一个spark作业的方式采用spark-submit来提交 ...

  7. 项目启动时警告 Establishing SSL connection without server's identity verification is not recommended

    项目启动时控制台提示警告: Tue May 14 23:16:10 CST 2019 WARN: Establishing SSL connection without server's identi ...

  8. android studio: 对齐成员变量及链式方法

    "File"-"Settings"-"Editor"-"Java"-"Wrapping and Braces& ...

  9. 产品经理 写SQL

    产品经理必备技能:写SQL - 云+社区 - 腾讯云https://cloud.tencent.com/developer/news/3177 产品经理学SQL(一)一个小时上手SQL | 人人都是产 ...

  10. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...