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#控制摄像头实现画面实时播放相关推荐

  1. 采集rtsp流摄像头到浏览器实时播放方案

    本文旨在实现使用摄像头采集视频,并且可以在网页实时显示,主要参考的两篇博文为:  1.  视频实时显示的三种方案   2.  使用WebSockets进行HTML5视频直播   我们使用博文1介绍的第 ...

  2. 海康摄像头前端调用实时画面解决方案(无插件版开发)

    文章目录 前言 一.海康摄像头 二.尝试方案 1.方案1 2.方案2 3.方案3 总结 前言 项目中有一个需求,是需要把海康摄像机的实时画面在项目前端的页面中展示出来.本文的技术栈主要用到了vue3. ...

  3. 基于ffmpeg+SDL 实时播放摄像头视频

    基于ffmpeg+SDL 实时播放摄像头视频 基本流程 udp接收rtp数据流接收一帧数据后,转换为NAL单元送去解码 (这里特别说明一下,我本次用的接口是支持从连续数据流中自动分割出一个个NAL的, ...

  4. ffmpeg推流实现实时播放监控画面(rtsp to rtmp)

    ffmpeg推流实现实时播放监控画面(windows) 1.提前准备:下载好nginx (官网下载即可) 下载好ffmpeg (windows版本点击下载 http://ffmpeg.zeranoe. ...

  5. Python + ffmepg + nginx-html-flv实现摄像头的实时播放

    Python + ffmepg + nginx-html-flv实现摄像头的实时播放 这段时间有个项目需要捕获摄像头的画面,做轨迹分析之后再做显示.做了四天的调研,虽然结果我还不是特别满意,但也颇有收 ...

  6. 网络摄像头RTSP视频流WEB端实时播放实现方案

    IPC视频流怎么实时在WEB浏览器播放,视频流格式是RTSP. 下面我整理了自己实现的方案以及网上看到的一些方案 一.FFmpeg + nginx 将转 hls 通过 video.js 在支持h5浏览 ...

  7. 使用手机摄像头实现视频监控实时播放

    使用手机摄像头实现视频监控实时播放 一.概述 视频监控实时播放的原理与目前较为流行的直播是一致的,所以采用直播的架构实现视频监控实时播放,流程图如下: #mermaid-svg-mUiqq5ywjTx ...

  8. unity3d人脸识别(二),实现摄像头画面实时检测对比,实现刷脸功能

    离线版人脸识别参考我的另外一篇博客:https://blog.csdn.net/GottaYiWanLiu/article/details/90442274 接着上一章unity3d人脸识别(一)来讲 ...

  9. VUE项目中优雅使用EasyPlayer实时播放摄像头多种格式视频

    EasyPlayer 介绍 简介:集播放http-flv, hls, websocket 于一身的H5视频直播/视频点播播放器, 使用简单, 功能强大: 功能支持: 支持 MP4 播放 支持 m3u8 ...

最新文章

  1. maven打包记录1
  2. AI一分钟 | 微软将成立微软亚洲研究院上海分院;阿里AI鉴黄师能判别呻吟声
  3. XtraGrid实现checkbox全选功能
  4. 工作中git 操作汇总
  5. Fatal error in launcher: Unable to create process using ‘“d:\python3.6\python.exe“ “D:\python3.6\Sc
  6. python 的dict的append()?
  7. IntelliJ IDEA 17和Maven构建javaWeb项目
  8. 【python】闭包
  9. jquery Fancybox使用教程
  10. python图片横向合并_[宜配屋]听图阁
  11. 如何有效开展小组教学_如何有效地开展小组合作学习——数学科主题教研活动...
  12. GaussDB(DWS)应用实践丨负载管理与作业排队处理方法
  13. OneNET物联网云平台HTTP数据流上传与下发,使用Fiddler调试开关应用,stm32 esp8266物联网家居远程开关
  14. Macaca简单入门
  15. Counting Bits -leetcode
  16. 使用 Python 进行数据清洗的完整指南
  17. Docker搭建Jenkins2.60.3版本,及更换jenkins下载源
  18. 腾讯云即时通讯IM前端使用步骤简述
  19. 游戏美术和策划,你感兴趣吗
  20. 三个学生开发的学术钓鱼软件,成功忽悠了整个学术圈

热门文章

  1. Linux 环境搭建(如何获得一个免费云服务器)以及Linux基本指令
  2. 用C语言for循环输出三角形
  3. 用计算机despair,despair造句
  4. Windows(Win7)下用Xming实现X11图形界面功能
  5. unity第三人称控制器2020.,在导入的时候没有选择重新启动,导致无法控制角色移动
  6. 通过OpenNI2获取数据并转至OpenCV格式及点云生成
  7. VggNet 论文分析
  8. 咪咕盒子链接服务器失败_【沙发管家】教你解决电视盒子使用时遇到的问题。|电视盒子|沙发管家|手机|智能电视|路由器|安卓系统...
  9. 数据库之数据库的部署与管理
  10. 课程7 :PLC常见指令详解:比较指令(工控PLC工程师入门必读,5天可上手调试)