wpf实现FFmpeg获取摄像头实时画面

news2025/1/20 2:00:05
  1. gitee地址如下

源码地址

  1. 如何获取摄像头验证码和ip

首先获取摄像头底部的验证码及ip(测试使用的是萤石摄像头,需要PC下载萤石客户端查看ip)

  1. 未连接之前可以通过VLC进行测试

在左上角(媒体)--》(流)--》(网络)--》输入rtsp链接

如下就是rtsp链接

rtsp://admin:IARWXE@192.168.0.196:554/h264/ch1/main/av_stream

测试还可以使用该rtsp链接

rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp

  1. 项目结构

  1. 源码

(1)MainWindow.xaml.cs

using FFmpeg.AutoGen;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
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.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace FFmpegPlayRtspDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            player1.RtspUrl = "rtsp://admin:IARWXE@192.168.0.196:554/h264/ch1/main/av_stream";
           //player1.RtspUrl = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4";
        }
    }
}

(2)MainWindow.xaml

<Window x:Class="FFmpegPlayRtspDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:FFmpegPlayRtspDemo"
        mc:Ignorable="d"
        Title="FFmpeg播放" Height="480" Width="800" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
    <Grid>
        <local:FFmpegPlayer x:Name="player1"/>

        
    </Grid>
</Window>

(3)FFmpegPlayer.xaml

<UserControl x:Class="FFmpegPlayRtspDemo.FFmpegPlayer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:FFmpegPlayRtspDemo"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Image Name="videodest01" Tag="01" Margin="386,210,0,-3"></Image>
        <Image Name="videodest02" Tag="02" Margin="0,211,427,3"></Image>
        <Image Name="videodest03" Tag="03" Margin="385,4,0,234"></Image>
        <Image Name="videodest04" Tag="04" Margin="0,0,428,236"></Image>
    </Grid>
</UserControl>

(4)FfmpegPlayer.xaml.cs

using FFmpeg.AutoGen;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
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.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace FFmpegPlayRtspDemo
{
    /// <summary>
    /// FFmpegPlayer.xaml 的交互逻辑
    /// </summary>
    public partial class FFmpegPlayer : UserControl
    {
        private string _RtspUrl;

        public string RtspUrl
        {
            get { return _RtspUrl; }
            set
            {
                _RtspUrl = value;
                Play();
            }
        }

        public bool CanRun;
        Thread thPlayer;

        public FFmpegPlayer()
        {
            InitializeComponent();
        }

        private void Play()
        {
            if (string.IsNullOrEmpty(RtspUrl))
                return;
            thPlayer = new Thread(DeCoding);
            thPlayer.SetApartmentState(ApartmentState.MTA);//设置单线程
            thPlayer.IsBackground = true;
            thPlayer.Start();
        }

        object _bitMapLocker = new object();
        private unsafe void DeCoding()
        {
            try
            {
                //if (ClassHelp.Instance.SysSettingModel.Camera1 != 0)
                //{
                ClassHelp.Instance.FFmpegHelp = new FFmpegHelp();
                ClassHelp.Instance.FFmpegHelp.Register();
                //}
                string strResult = "";
                lock (_bitMapLocker)
                {
                    // 更新图片显示
                    FFmpegHelp.ShowBitmap show = (bmp) =>
                    {
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            Bitmap oldBitMap;
                            Bitmap autobitmap;

                            if (bmp != null)
                            {
                                oldBitMap = bmp;
                                autobitmap = bmp;
                                ImageSource videSource = ImageSourceForBitmap(oldBitMap);
                                this.videodest01.Source = videSource;
                                this.videodest02.Source = videSource;
                                this.videodest03.Source = videSource;
                                this.videodest04.Source = videSource;
                                ClassHelp.Instance.IsAlert = false;
                            }
                            else
                            {
                                ClassHelp.Instance.IsAlert = true;
                                ClassHelp.Instance.IsNetwork = true;
                            }
                        }));
                    };
                    ClassHelp.Instance.FFmpegHelp.Start(show, RtspUrl, out strResult);
                    //Start(show, RtspUrl, out strResult);
                    if (!string.IsNullOrEmpty(strResult) && ClassHelp.Instance.IsAlert == true)
                    {
                        ClassHelp.Instance.IsAlert = false;
                        ClassHelp.Instance.IsNetwork = false;
                        this.Dispatcher.Invoke(new Action(() =>
                        {
                            MessageBox.Show($"错误信息:{strResult}");
                        }));
                    }
                }
            }
            finally
            {
                thPlayer.DisableComObjectEagerCleanup();
                thPlayer = null;
                thPlayer = new Thread(DeCoding);
                thPlayer.IsBackground = true;
                thPlayer.Start();
            }
        }

        [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool DeleteObject([In] IntPtr hObject);

        public ImageSource ImageSourceForBitmap(Bitmap bmp)
        {
            var handle = bmp.GetHbitmap();
            try
            {
                ImageSource newSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                DeleteObject(handle);
                return newSource;
            }
            catch (Exception ex)
            {
                DeleteObject(handle);
                return null;
            }
        }
    }
}
  1. 截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openGauss中Schema赋权小试

目录 概述 1.关于public的权限要点&#xff1a; 2.关于用户同名的schema的权限要点&#xff1a; 3.关于普通schema的权限要点&#xff1a; 概述 下面是openGauss官网对Schema的介绍&#xff1a; Schema又称作模式。通过管理Schema&#xff0c;允许多个用户使用同一数据库而…

MATLAB-二维线性插值运算

二维插值在图像处理和数据可视化方面得到了大量的应用&#xff0c;二维插值的基本原理与一维插值一样&#xff0c;但二维插值是对两个变量进行函数的插值。在MATLAB中&#xff0c;主要使用interp2()函数进行二维插值的实现&#xff0c;其调用格式如下&#xff0c;zi interp2(z,…

Nodejs也能做文本数据处理了,快来看看吧!

随着汉语言的广泛应用&#xff0c;中文信息处理成了一个重要的研究课题&#xff0c;常见于搜索引擎&#xff1a;信息检索、中外文自动翻译、数据挖掘技术、自然语言处理等领域。在处理的过程中&#xff0c;中文分词是最基础的一环。 nodejieba 简介 nodeJieba 是结巴中文分词…

安装thinkphp

[TOC]目录 1. 安装composer 方法&#xff1a;https://www.kancloud.cn/manual/thinkphp6_0/1037481 官网教程中安装composer 2. 配置文件 在命令行中 阿里云&#xff1a; composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 华为云&#x…

axios基础学习——通过 Vue + axios 获取接口数据的小demo

文章目录 &#x1f4cb;前言 &#x1f3af;关于axios概要 ❓什么是axios &#x1f9e9;axios特性 &#x1f9e9;axios浏览器支持情况 &#x1f3af;axios安装与使用 &#x1f9e9;axios请求方法 &#x1f9e9;axios的使用方法&#xff08;以get为例子&#xff09; &am…

[C语言]进一步的来了解指针(多多多图详解)

本文章进一步的来讲解指针&#xff0c;如果是第一次接触指针的可以先看一下对于指针的初步理解 &#xff1a; [C语言]初步的来了解一下指针&#xff08;多图详解&#xff09;_HY_PIGIE的博客-CSDN博客 目录 1.字符指针 2.指针数组 2.1指针数组&#xff1a;char*类型举例说明 2…

Thawte旗下通配符SSL证书都有什么区别

Thawte由南非Mark Shuttleworth创立&#xff0c;Thawte SSL证书产品占据了全球SSL数字证书市场的40&#xff05;&#xff0c;是全球第三大数字证书颁发机构&#xff08;CA&#xff09;。随后VeriSign于2000年2月1日以5.75亿美元对Thawte换股完成收购&#xff0c;互相合作&#…

GDI对象泄漏导致程序UI界面绘制异常的问题排查

目录 1、问题说明 2、初步分析 3、查看任务管理器&#xff0c;并使用GDIView工具分析 5、采用历史版本比对法&#xff0c;确定初次出现问题的时间点&#xff0c;并查看前一天的代码修改记录 6、将修改的代码与测试现象结合起来&#xff0c;最终定位问题 7、事后的思考 8…

Simulating Content Consistent Vehicle Datasets with Attribute Descent(略读)

提出了一个大型的3D合成数据集VehicleX。其中各个3D模型都有现实世界的车型对应。整个数据集有1362个id&#xff0c;其中包括11种主流车型。 论文&#xff1a;https://arxiv.org/pdf/1912.08855.pdf 摘要 本文使用图形引擎来模拟带有免费注释的大量训练数据。 在合成数据和真…

回归预测 | MATLAB实现RF随机森林多输入单输出回归预测(含回归树,误差柱状图,多指标)

回归预测 | MATLAB实现RF随机森林多输入单输出回归预测(含回归树,误差柱状图,多指标) 目录 回归预测 | MATLAB实现RF随机森林多输入单输出回归预测(含回归树,误差柱状图,多指标)效果分析基本介绍输出结果程序设计学习总结参考资料效果分析

Mars3D Studio平台发布

近日我们基于提供丰富及智能化功能&#xff0c;助力团队做出精美的交互场景的理念&#xff0c;研发了Mars3D Studio平台&#xff0c;于2023年1月10日正式发布上线&#xff01;欢迎大家访问http://studio.mars3d.cn/ 网站进行体验。一、资源广场团队公开的丰富资源数据&#xff…

LeetCode题目笔记——1658. 将 x 减到 0 的最小操作数

文章目录题目描述题目难度——中等方法一&#xff1a;反向思考&#xff0c;双指针求最长子数组代码/Python代码/C方法二&#xff1a;滑动窗口代码总结我把这篇也归到面试题那一栏&#xff0c;因为觉得这题的思路和思考方式还挺好的&#xff0c;或许能用到其他题上 题目描述 给…

基于Node.js Vue清新严选助农电商平台/电商平台/购物平台

摘 要网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于清新严选助农电商将是又一个传统管理到智能化信息管理的改革&#xff0c;设计清新严选助农电商平台的目的就是借助计算机让复杂的购买商品操作变简单&#x…

gcc和gdb的使用——Linux

Linux学习全部合集点击即可订阅 “人生得意须尽欢” 这里是目录标题gcc的基本操作gcc处理代码的步骤预处理编译汇编链接头文件和库静态库动态库gdb调试makefile什么是makefile&#xff1f;进度条的实现缓冲区回车和换行git的使用.gitigonregcc的基本操作 编写代码的最基本操作…

【工具Share】用VBA获取批量文件中的同一个单元格内容

最近鼓捣了个工具&#xff0c;可以批量从固定文件夹的excel中获取同一个单元格中的具体内容&#xff08;当然&#xff0c;你也可以根据自己的需要&#xff0c;进行多个单元格内容的取得&#xff09; 可能这么说比较抽象&#xff0c;举例来说比如你在多个相同模板的excel中定义了…

java循环结构的概述

在之前的文章中&#xff0c;已经给大家详细地介绍过变量相关的内容&#xff0c;比如变量的概念、命名规范、变量的定义及底层原理等内容。但其实变量还有作用范围的概念&#xff0c;并且根据作用范围的不同&#xff0c;变量还可以分为成员变量、局部变量等内容。在我们今天开始…

Nacos config 配置中心详解

Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config&#xff0c;您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。Spring Cloud Alibaba Naco…

【算法基础(1)】认识时间复杂度和常用排序算法

1 认识时间复杂度 1.1 什么是时间复杂度&#xff1f; 时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间&#xff0c;在软件开发中&#xff0c;时间复杂度就是用来方便开发者估算出程序运行时间&#xff0c;通常用算法的操作单元数量来代表程序消耗的时间&#xf…

pageoffice在线编辑word文件并禁止选中

一、整篇文档禁止选中 wordDoc.setDisableWindowSelection(true); //禁止word的选择文字功能 二、根据条件判断是否禁止选中 比如&#xff1a;选中内容超过一定字数&#xff0c;取消选中 解决方案&#xff1a;使用后端提供的OnWordSelectionChange事件。 PageOfficeCtrl po…

sgRNAs基因编辑

CRISPR-Cas9知识学习笔记 https://www.163.com/dy/article/FGCP58KC0532AN5N.html https://crispr.dbcls.jp CRISPR&#xff08;clustered regularly interspaced short palindromic repeats&#xff0c;成簇的规律间隔短回文重复序列&#xff09;和CRISPR-associated protein …