C#控制摄像头实现画面实时播放
C#控制摄像头实现画面实时播放
- 思路说明
- 关键代码
- 完整代码下载
思路说明
主要是调用Win32API(avicap32.dll)实现。
关键代码
AviCapture.dll
using System;
using System.Runtime.InteropServices;namespace Wongoing.Basic.Camera
{/// <summary>/// AviCapture 的摘要说明。/// </summary>public class AviCapture{//通过调用acicap32.dll进行读取摄像头数据[DllImport("avicap32.dll")]public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);[DllImport("avicap32.dll")]public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);[DllImport("User32.dll")]public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);[DllImport("User32.dll")]public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);[DllImport("avicap32.dll")]public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);//部分常量public const int WM_USER = 0x400;public const int WS_CHILD = 0x40000000;public const int WS_VISIBLE = 0x10000000;public const int SWP_NOMOVE = 0x2;public const int SWP_NOZORDER = 0x4;public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;public const int WM_CAP_SET_PREVIEW = WM_USER + 50;public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;// 结构[StructLayout(LayoutKind.Sequential)]//VideoHdrpublic struct VIDEOHDR{[MarshalAs(UnmanagedType.I4)]public int lpData;[MarshalAs(UnmanagedType.I4)]public int dwBufferLength;[MarshalAs(UnmanagedType.I4)]public int dwBytesUsed;[MarshalAs(UnmanagedType.I4)]public int dwTimeCaptured;[MarshalAs(UnmanagedType.I4)]public int dwUser;[MarshalAs(UnmanagedType.I4)]public int dwFlags;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]public int[] dwReserved;}[StructLayout(LayoutKind.Sequential)]//BitmapInfoHeaderpublic struct BITMAPINFOHEADER{[MarshalAs(UnmanagedType.I4)]public Int32 biSize;[MarshalAs(UnmanagedType.I4)]public Int32 biWidth;[MarshalAs(UnmanagedType.I4)]public Int32 biHeight;[MarshalAs(UnmanagedType.I2)]public short biPlanes;[MarshalAs(UnmanagedType.I2)]public short biBitCount;[MarshalAs(UnmanagedType.I4)]public Int32 biCompression;[MarshalAs(UnmanagedType.I4)]public Int32 biSizeImage;[MarshalAs(UnmanagedType.I4)]public Int32 biXPelsPerMeter;[MarshalAs(UnmanagedType.I4)]public Int32 biYPelsPerMeter;[MarshalAs(UnmanagedType.I4)]public Int32 biClrUsed;[MarshalAs(UnmanagedType.I4)]public Int32 biClrImportant;}[StructLayout(LayoutKind.Sequential)]//BitmapInfopublic struct BITMAPINFO{[MarshalAs(UnmanagedType.Struct, SizeConst = 40)]public BITMAPINFOHEADER bmiHeader;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]public Int32[] bmiColors;}public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);// 公共函数public static object GetStructure(IntPtr ptr, ValueType structure){return Marshal.PtrToStructure(ptr, structure.GetType());}public static object GetStructure(int ptr, ValueType structure){return GetStructure(new IntPtr(ptr), structure);}public static void Copy(IntPtr ptr, byte[] data){Marshal.Copy(ptr, data, 0, data.Length);}public static void Copy(int ptr, byte[] data){Copy(new IntPtr(ptr), data);}public static int SizeOf(object structure){return Marshal.SizeOf(structure);}}
}
Camera.dll
using System;
using System.Runtime.InteropServices;namespace Wongoing.Basic.Camera
{/// <summary>/// 相机类定义/// </summary>public class Camera{private IntPtr lwndC;private IntPtr mControlPtr;private int mWidth;private int mHeight;/// <summary>/// 构造函数/// </summary>/// <param name="handle"></param>/// <param name="width"></param>/// <param name="height"></param>public Camera(IntPtr handle, int width,int height){mControlPtr = handle;mWidth = width;mHeight = height;}// 帧回调的委托public delegate void RecievedFrameEventHandler(byte[] data);public event RecievedFrameEventHandler RecievedFrame;private AviCapture.FrameEventHandler mFrameEventHandler;/// <summary>/// 关闭摄像头/// </summary>public void CloseWebcam(){this.capDriverDisconnect(this.lwndC);}/// <summary>/// 开启摄像头/// </summary>public void StartWebCam(){byte[] lpszName = new byte[100];byte[] lpszVer = new byte[100];AviCapture.capGetDriverDescriptionA(0, lpszName, 100,lpszVer, 100);this.lwndC = AviCapture.capCreateCaptureWindowA(lpszName, AviCapture.WS_VISIBLE + AviCapture.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);if (this.capDriverConnect(this.lwndC, 0)){this.capPreviewRate(this.lwndC, 66);this.capPreview(this.lwndC, true);AviCapture.BITMAPINFO bitmapinfo = new AviCapture.BITMAPINFO(); bitmapinfo.bmiHeader.biSize = AviCapture.SizeOf(bitmapinfo.bmiHeader);bitmapinfo.bmiHeader.biWidth = this.mWidth;bitmapinfo.bmiHeader.biHeight = this.mHeight;bitmapinfo.bmiHeader.biPlanes = 1;bitmapinfo.bmiHeader.biBitCount = 24;this.capSetVideoFormat(this.lwndC, ref bitmapinfo, AviCapture.SizeOf(bitmapinfo));this.mFrameEventHandler = new AviCapture.FrameEventHandler(FrameCallBack);this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);AviCapture.SetWindowPos(this.lwndC, 0, 0, 0, mWidth , mHeight , 6);} }#region 私有方法定义private bool capDriverConnect(IntPtr lwnd, short i){return AviCapture.SendMessage(lwnd, AviCapture.WM_CAP_DRIVER_CONNECT, i, 0);}private bool capDriverDisconnect(IntPtr lwnd){return AviCapture.SendMessage(lwnd, AviCapture.WM_CAP_DRIVER_DISCONNECT, 0, 0);}private bool capPreview(IntPtr lwnd, bool f){return AviCapture.SendMessage(lwnd, AviCapture.WM_CAP_SET_PREVIEW , f, 0);}private bool capPreviewRate(IntPtr lwnd, short wMS){return AviCapture.SendMessage(lwnd, AviCapture.WM_CAP_SET_PREVIEWRATE, wMS, 0);}private bool capSetCallbackOnFrame(IntPtr lwnd, AviCapture.FrameEventHandler lpProc){ return AviCapture.SendMessage(lwnd, AviCapture.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);}private bool capSetVideoFormat(IntPtr hCapWnd, ref AviCapture.BITMAPINFO BmpFormat, int CapFormatSize){return AviCapture.SendMessage(hCapWnd, AviCapture.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);}private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr){AviCapture.VIDEOHDR videoHeader = new AviCapture.VIDEOHDR();byte[] VideoData;videoHeader = (AviCapture.VIDEOHDR)AviCapture.GetStructure(lpVHdr,videoHeader);VideoData = new byte[videoHeader.dwBytesUsed];AviCapture.Copy(videoHeader.lpData ,VideoData);if (this.RecievedFrame != null)this.RecievedFrame (VideoData);}#endregion}
}
完整代码下载
完整代码下载
C#控制摄像头实现画面实时播放相关推荐
- 采集rtsp流摄像头到浏览器实时播放方案
本文旨在实现使用摄像头采集视频,并且可以在网页实时显示,主要参考的两篇博文为: 1. 视频实时显示的三种方案 2. 使用WebSockets进行HTML5视频直播 我们使用博文1介绍的第 ...
- 海康摄像头前端调用实时画面解决方案(无插件版开发)
文章目录 前言 一.海康摄像头 二.尝试方案 1.方案1 2.方案2 3.方案3 总结 前言 项目中有一个需求,是需要把海康摄像机的实时画面在项目前端的页面中展示出来.本文的技术栈主要用到了vue3. ...
- 基于ffmpeg+SDL 实时播放摄像头视频
基于ffmpeg+SDL 实时播放摄像头视频 基本流程 udp接收rtp数据流接收一帧数据后,转换为NAL单元送去解码 (这里特别说明一下,我本次用的接口是支持从连续数据流中自动分割出一个个NAL的, ...
- ffmpeg推流实现实时播放监控画面(rtsp to rtmp)
ffmpeg推流实现实时播放监控画面(windows) 1.提前准备:下载好nginx (官网下载即可) 下载好ffmpeg (windows版本点击下载 http://ffmpeg.zeranoe. ...
- Python + ffmepg + nginx-html-flv实现摄像头的实时播放
Python + ffmepg + nginx-html-flv实现摄像头的实时播放 这段时间有个项目需要捕获摄像头的画面,做轨迹分析之后再做显示.做了四天的调研,虽然结果我还不是特别满意,但也颇有收 ...
- 网络摄像头RTSP视频流WEB端实时播放实现方案
IPC视频流怎么实时在WEB浏览器播放,视频流格式是RTSP. 下面我整理了自己实现的方案以及网上看到的一些方案 一.FFmpeg + nginx 将转 hls 通过 video.js 在支持h5浏览 ...
- 使用手机摄像头实现视频监控实时播放
使用手机摄像头实现视频监控实时播放 一.概述 视频监控实时播放的原理与目前较为流行的直播是一致的,所以采用直播的架构实现视频监控实时播放,流程图如下: #mermaid-svg-mUiqq5ywjTx ...
- unity3d人脸识别(二),实现摄像头画面实时检测对比,实现刷脸功能
离线版人脸识别参考我的另外一篇博客:https://blog.csdn.net/GottaYiWanLiu/article/details/90442274 接着上一章unity3d人脸识别(一)来讲 ...
- VUE项目中优雅使用EasyPlayer实时播放摄像头多种格式视频
EasyPlayer 介绍 简介:集播放http-flv, hls, websocket 于一身的H5视频直播/视频点播播放器, 使用简单, 功能强大: 功能支持: 支持 MP4 播放 支持 m3u8 ...
最新文章
- maven打包记录1
- AI一分钟 | 微软将成立微软亚洲研究院上海分院;阿里AI鉴黄师能判别呻吟声
- XtraGrid实现checkbox全选功能
- 工作中git 操作汇总
- Fatal error in launcher: Unable to create process using ‘“d:\python3.6\python.exe“ “D:\python3.6\Sc
- python 的dict的append()?
- IntelliJ IDEA 17和Maven构建javaWeb项目
- 【python】闭包
- jquery Fancybox使用教程
- python图片横向合并_[宜配屋]听图阁
- 如何有效开展小组教学_如何有效地开展小组合作学习——数学科主题教研活动...
- GaussDB(DWS)应用实践丨负载管理与作业排队处理方法
- OneNET物联网云平台HTTP数据流上传与下发,使用Fiddler调试开关应用,stm32 esp8266物联网家居远程开关
- Macaca简单入门
- Counting Bits -leetcode
- 使用 Python 进行数据清洗的完整指南
- Docker搭建Jenkins2.60.3版本,及更换jenkins下载源
- 腾讯云即时通讯IM前端使用步骤简述
- 游戏美术和策划,你感兴趣吗
- 三个学生开发的学术钓鱼软件,成功忽悠了整个学术圈
热门文章
- Linux 环境搭建(如何获得一个免费云服务器)以及Linux基本指令
- 用C语言for循环输出三角形
- 用计算机despair,despair造句
- Windows(Win7)下用Xming实现X11图形界面功能
- unity第三人称控制器2020.,在导入的时候没有选择重新启动,导致无法控制角色移动
- 通过OpenNI2获取数据并转至OpenCV格式及点云生成
- VggNet 论文分析
- 咪咕盒子链接服务器失败_【沙发管家】教你解决电视盒子使用时遇到的问题。|电视盒子|沙发管家|手机|智能电视|路由器|安卓系统...
- 数据库之数据库的部署与管理
- 课程7 :PLC常见指令详解:比较指令(工控PLC工程师入门必读,5天可上手调试)