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. meshing-网格加密

    ​原视频下载:http://yunpan.cn/cujvm8VbAPJZi  访问密码 0d3b

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

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

  3. Java TreeMap使用

    场景: 随机生成50个10到50的数字.然后顺序输出每个数字出现的次数 实现原理: 使用TreeMap,默认带了顺序排序的功能 public static void main(String[] arg ...

  4. Java TreeSet,Collections使用

    一.创建TreeSet实例 public static void main(String[] args) { TreeSet set = new TreeSet(); set.add("C& ...

  5. nginx listen 端口 443 80 https 和 wss

    端口号 443 和 80 端口的区别 一般指定 443 和 80 端口都是使用域名时所需要的 当我们使用域名请求时,一般是不添加端口号的 例如:http://www.baidu.com 在不添加端口号 ...

  6. shared_ptr 引用计数

    https://zh.cppreference.com/w/cpp/memory/shared_ptr 引用计数

  7. Acunetix Web Vulnerability Scanner abbr. AWVS

    awvs 中文手册详细版 - 木讷 - 博客园https://www.cnblogs.com/iamver/p/7124718.html Download Acunetix Trialhttps:// ...

  8. bat 获取 exe 文件中 产品版本号并存储到变量中

    set EXE='D:\gitlab\drivereasy3\DriverEasyWPF\bin\Release\DriverEasy.exe' powershell "(Get-Item ...

  9. Flutter 中AlertDialog确认提示弹窗

    import 'package:flutter/material.dart'; import 'dart:async'; enum Action { Ok, Cancel } class AlertD ...

  10. 封装Email相关的操作

    package com.opslab.util; import javax.activation.DataHandler;import javax.activation.DataSource;impo ...