VS+C#+WPF多线程视频摄像头播放器监控
程序示例精选
C#+WPF多线程视频摄像头播放器监控
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
前言这篇博客针对编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
为什么需要用多线程,多线程是远程视频采集播放主要算法功能,防止卡顿,黑屏,蓝屏,花屏问题,所以远程视频采集播放多线程算法功能是必须采用的一种方法。
文章目录 一、所需工具软件 二、使用步骤 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变量1 public 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{ /// /// MainWindow.xaml 的交互逻辑 /// /// 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"; } //