VS+C#+WPF多线程视频摄像头播放器监控
程序示例精选
C#+WPF多线程视频摄像头播放器监控
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
前言
这篇博客针对<<C#+WPF多线程视频摄像头播放器监控>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
为什么需要用多线程,多线程是远程视频采集播放主要算法功能,防止卡顿,黑屏,蓝屏,花屏问题,所以远程视频采集播放多线程算法功能是必须采用的一种方法。
文章目录
一、所需工具软件
二、使用步骤
1. 引入库
2. 代码实现
3. 运行结果
三、在线协助
一、所需工具软件
1. VS,WPF
2. OpenCV
二、使用步骤
1.引入库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Threading;
using System.Timers;using System.ComponentModel;
2. 代码实现
代码如下:
public class Thread1Class : System.Windows.Window
{// 第一个线程要执行的代码//多线程1//opencv变量1public Mat frameMatT1;private volatile bool stopFlag = false;private ManualResetEvent pauseSignal = new ManualResetEvent(true);public void Thread1Function(){try{// 在这里编写第一个线程要执行的代码Console.WriteLine("capture0");// 在这里编写要在UI线程上执行的操作VideoCapture capture1 = new VideoCapture();capture1.Open("aa.mp4", VideoCaptureAPIs.ANY);Console.WriteLine("capture00");if (capture1.IsOpened()){Console.WriteLine("capture1");// 循环读取视频帧并在图像控件中显示while (!stopFlag){Mat frameMat1 = capture1.RetrieveMat();if (!frameMat1.Empty()){//Console.WriteLine("hello111222");}frameMatT1 = new Mat();frameMat1.CopyTo(frameMatT1);// 暂停线程pauseSignal.WaitOne();}// 释放资源capture1.Release();}}catch (ThreadAbortException ex){// 线程已被终止}}}public class Thread2Class : System.Windows.Window
{// 第二个线程要执行的代码public void Thread2Function(){// 在这里编写第二个线程要执行的代码Console.WriteLine("Thread2Function");}
}namespace WpfApp1
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>/// public partial class MainWindow : System.Windows.Window{private Thread1Class thread1Object; //线程1定义private Thread2Class thread2Object; //线程2定义private DispatcherTimer _timer11; //计时器定义private int _count = 0; // 计时器已经运行的秒数private bool _isPaused = false; // 标识计时器是否处于暂停状态public MainWindow(){InitializeComponent();timer11Init11();}private void timer11Init11(){// 创建一个新的计时器对象_timer11 = new DispatcherTimer();// 设置计时器间隔时间为1秒_timer11.Interval = TimeSpan.FromSeconds(0.2);// 订阅Tick事件,并将其处理程序设置为我们想要自动执行的函数_timer11.Tick += new EventHandler(video_display11);}private void timerStart11(object sender, RoutedEventArgs e){try{string buttonText = userPC.Content.ToString();if (buttonText == "开始"){// 启动计时器_timer11.Start();Console.WriteLine("_timerStart");userPC.Content = "暂停";}if (buttonText == "暂停"){// 如果计时器正在运行,则暂停计时器if (_timer11.IsEnabled){_timer11.Stop();_isPaused = true;}userPC.Content = "恢复";}if (buttonText == "恢复"){// 如果计时器处于暂停状态,则恢复计时器if (_isPaused){_timer11.Start();_isPaused = false;}userPC.Content = "暂停";}}catch (ThreadAbortException ex){// 线程已被终止}}private void myPauseButton_Click(object sender, RoutedEventArgs e){// 如果计时器正在运行,则暂停计时器if (_timer11.IsEnabled){_timer11.Stop();_isPaused = true;}}private void myResumeButton_Click(object sender, RoutedEventArgs e){// 如果计时器处于暂停状态,则恢复计时器if (_isPaused){_timer11.Start();_isPaused = false;}}private void myStopButton_Click(object sender, RoutedEventArgs e){// 停止计时器并重置计时器已运行的秒数_timer11.Stop();_count = 0;timerLabel11.Content = "0";}//链接计时器private void video_display11(object sender, EventArgs e){try{Console.WriteLine("video_display");if (thread1Object != null){if (thread1Object.frameMatT1 != null){Console.WriteLine("video_display0");if (value != null && value.Rows > 0 && value.Cols > 0){}else{Console.WriteLine("video_close ");}}}_count++;timerLabel11.Content = _count.ToString();}catch (ThreadAbortException ex){// 线程已被终止}}private void videoModel_init11(object sender, RoutedEventArgs e){try{string buttonText = model_init11.Content.ToString();if (buttonText == "模型初始化"){thread1Object = new Thread1Class();thread1Object.RunThread();Console.WriteLine("RunThread");model_init11.Content = "暂停模型";}if (buttonText == "暂停模型"){model_init11.Content = "恢复模型";thread1Object.PauseThread();}if (buttonText == "恢复模型"){model_init11.Content = "暂停模型";thread1Object.ResumeThread();}}catch (ThreadAbortException ex){// 线程已被终止}}private void videoModel_Stop11(object sender, RoutedEventArgs e){try{thread1Object.StopThread();}catch (ThreadAbortException ex){// 线程已被终止}}} //class类结束
} //namespace结束
3. 运行结果
三、在线协助:
如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Qt, C++, Python入门指导
3)界面美化
4)软件制作
博主推荐文章:python人脸识别统计人数qt窗体-CSDN博客
博主推荐文章:Python Yolov5火焰烟雾识别源码分享-CSDN博客
Python OpenCV识别行人入口进出人数统计_python识别人数-CSDN博客
个人博客主页:alicema1111的博客_CSDN博客-Python,C++,网页领域博主
博主所有文章点这里:alicema1111的博客_CSDN博客-Python,C++,网页领域博主
VS+C#+WPF多线程视频摄像头播放器监控相关推荐
- android 桌面视频播放器,ZY-Player ,一款跨平台桌面端视频资源播放器
前段时间为大家整理了一波免费高清的影视站,详见<酷站分享,免费看高清VIP电影>,影视资源站当然要多多益善.除此之外,各种第三方优秀的播放器也可多收藏一些,譬如今天介绍的这款ZY Play ...
- YUVPlayer: 基于Android平台的YUV视频原始数据播放器
基于Android平台的YUV视频原始数据播放器 编译环境 FFmpeg版本: 4.2.2 NDK版本:r17c 运行环境 x86(模拟器) arm64-v8a(64位手机) 功能点 从文件中读取YU ...
- html选择本地文件视频并播放器,使HTML5视频播放器播放不同的文件(Make a HTML5 video player play a different file)...
使HTML5视频播放器播放不同的文件(Make a HTML5 video player play a different file) 在播放视频时,我无法让HTML5播放器播放不同的视频,我尝试更改 ...
- 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误
正文: 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误,此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况,测试环境:PHP7.0+MySQL5.6 安装教程: 1,访问/d ...
- vue 背景图 自适应_Vue的自适应视频背景播放器
vue 背景图 自适应 Vue响应视频背景播放器 (vue-responsive-video-background-player) Play your own videos in background ...
- 手把手教你如何在WPF中应用VLC播放器
WPF中应用VLC播放器 *1. 在WPF的"引用:中点击右键,选择管理NuGet程序包,输入vlc,安装VLC.DOtNet.Wpf包 *2.在VLC官网下载VLC播放器,注意你的项目是3 ...
- WPF中应用VLC播放器
WPF中应用VLC播放器 文章目录 WPF中应用VLC播放器 1. 安装VLC.DOtNet.Wpf包 2.程序中使用 3.源代码 4.VLC GitHub源代码 1. 安装VLC.DOtNet.Wp ...
- 2021最新哔哩bilibili视频弹幕播放器带后台版本完整无错修复
源码介绍: 此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况.站长亲测_测试环境:PHP7.0+MySQL5.6 优化修复功能:1.修复优化播放器播放结束自动下一集代码2.修复 ...
- 最新哔哩bilibili视频弹幕播放器源码+完整无错带后台/亲测
正文: 最新哔哩bilibili视频弹幕播放器源码+完整无错带后台/亲测,此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况,测试环境:PHP7.0+MySQL5.6 播放器跨域 ...
- canvas 视频音乐播放器
canvas 视频音乐播放器 canvas 视频音乐播放器 var play_nor_img_path = 'images/play_btn_n.png'; //播放按钮 正常时 60x60 px v ...
最新文章
- 查看 并发请求数及其TCP连接状态
- 理解 async/await 的执行
- 精品软件 推荐 ACPsoft PDF Converter 免费的多功能 PDF 转换器
- n个人选k个c语言_leetcode之第k个缺失的正整数
- Java使用ojdbc连接Oracle数据库时不能使用服务名连接的问题
- 关于scriptManager与JS代码兼容问题
- idea超炫的自定义模板
- Spring Security(02)——关于登录
- 压测 broken pipe 之类
- 机器学习(一)线性模型之岭回归器RidgeRegressor
- java ee 结构图,javaee体系结构图
- excel 删除大量空白行
- python与会计学_财务与会计前沿讲座——“大数据集训”开讲
- 让树莓派变身照相机——摄像头控制
- 智能在线客服是如何工作的?
- Python杀死Excel?众多模块哪家强
- 文本分割之垂直投影法基于OpenCV(python)的实现
- 笔记本计算机排名2015,2015性价比高的笔记本电脑排行榜
- loadrunner入门教程(11)--回放脚本
- 运放如何产生三角波信号