关于 web cam 使用自家的摄像头实现 视频捕捉技术 高级篇
网络上一大堆的视频捕捉代码,比如:
![](/assets/blank.gif)
![](/assets/blank.gif)
{
// showVideo calls
[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);
// constants
public const int WM_USER = 0x400 ;
public const int WS_CHILD = 0x40000000 ;
public const int WS_VISIBLE = 0x10000000 ;
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_START = WM_USER;
public const int WM_CAP_STOP = WM_CAP_START + 68 ;
public const int WM_CAP_SAVEDIB = WM_CAP_START + 25 ;
public const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60 ;
public const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20 ;
public const int WM_CAP_SEQUENCE = WM_CAP_START + 62 ;
public const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63 ;
public const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51 ;
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_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6 ;
public const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2 ;
public const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3 ;
public const int WM_CAP_SET_SCALE = WM_CAP_START + 53 ;
public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45 ;
public const int SWP_NOMOVE = 0x2 ;
public const int SWP_NOZORDER = 0x4 ;
// Structures
[StructLayout(LayoutKind.Sequential)]
public 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)]
public 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)]
public 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 methods
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);
}
}
但是使用的例子却没有,特别关于视频流的问题。因此我特地查看了msdn。现在把研究过程写下来:
http://msdn.microsoft.com/en-us/library/ms713477(VS.85).aspx
在c#里面的例子,实际上使用了AVICap这个c++的类库。 他的功能包括:
1. 捕捉视频音频到avi文件
2. 动态链接、断开捕捉设备
3. 查看实时的视频信号
4. 设置捕捉率
5. 显示设置对话框、palettes
6. 拷贝图像到剪贴板
7. 对单个图像进行截图+保存为DIB
8. Specify a file to use when capturing and copy the contents of the capture file to another file.(这个没太理解)
现在对avicap所有方法进行说明:
1. 建立一个捕捉窗口:
![](/assets/blank.gif)
![](/assets/blank.gif)
(LPSTR) " My Capture Window " , // window name if pop-up
WS_CHILD | WS_VISIBLE, // window style
0 , 0 , 160 , 120 , // window position and dimensions
(HWND) hwndParent,
( int ) nID /* child ID *
2. 链接捕捉设备
![](/assets/blank.gif)
![](/assets/blank.gif)
//
// Or, use the macro to connect to the MSVIDEO driver:
// fOK = capDriverConnect(hWndC, 0);
//
// Place code to set up and capture video here.
//
capDriverDisconnect (hWndC);
3. 枚举可以使用的捕捉设备:
char szDeviceVersion[ 80 ];
for (wIndex = 0 ; wIndex < 10 ; wIndex ++ )
{
if (capGetDriverDescription(
wIndex,
szDeviceName,
sizeof (szDeviceName),
szDeviceVersion,
sizeof (szDeviceVersion)
))
{
// Append name to list of installed capture drivers
// and then let the user select a driver to use.
}
}
4. 获取捕捉设备的能力
![](/assets/blank.gif)
![](/assets/blank.gif)
SendMessage (hWndC, WM_CAP_DRIVER_GET_CAPS,
sizeof (CAPDRIVERCAPS), (LONG) (LPVOID) & CapDrvCaps);
// Or, use the macro to retrieve the driver capabilities.
// capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));
5. 获取捕捉窗口的状态
CAPSTATUS CapStatus;
capGetStatus(hWndC, & CapStatus, sizeof (CAPSTATUS));
SetWindowPos(hWndC, NULL, 0 , 0 , CapStatus.uiImageWidth,
CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE)
6. 显示设置捕捉窗口
代码
capDriverGetCaps(hWndC, & CapDrvCaps, sizeof (CAPDRIVERCAPS));
// Video source dialog box.
if (CapDriverCaps.fHasDlgVideoSource)
capDlgVideoSource(hWndC);
// Video format dialog box.
if (CapDriverCaps.fHasDlgVideoFormat)
{
capDlgVideoFormat(hWndC);
// Are there new image dimensions?
capGetStatus(hWndC, & CapStatus, sizeof (CAPSTATUS));
// If so, notify the parent of a size change.
}
// Video display dialog box.
if (CapDriverCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(hWndC);
7. 预览图像
capPreview(hWndC, TRUE); // starts preview
// Preview
capPreview(hWnd, FALSE); // disables preview
8. 判断是否允许图像叠加(overlay)
CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(hWndC, & CapDrvCaps, sizeof (CAPDRIVERCAPS));
if (CapDrvCaps.fHasOverlay)
capOverlay(hWndC, TRUE);
9. 对视频捕捉文件命名
char szCaptureFile[] = "MYCAP.AVI";
capFileSetCaptureFile( hWndC, szCaptureFile);
capFileAlloc( hWndC, ( 1024L * 1024L * 5 ));
10. 设置声音捕捉
![](/assets/blank.gif)
![](/assets/blank.gif)
wfex.wFormatTag = WAVE_FORMAT_PCM;
wfex.nChannels = 2 ; // Use stereo
wfex.nSamplesPerSec = 11025 ;
wfex.nAvgBytesPerSec = 22050 ;
wfex.nBlockAlign = 2 ;
wfex.wBitsPerSample = 8 ;
wfex.cbSize = 0 ;
capSetAudioFormat(hWndC, & wfex, sizeof (WAVEFORMATEX));
11. 改变视频捕捉设置
![](/assets/blank.gif)
![](/assets/blank.gif)
float FramesPerSec = 10.0 ;
capCaptureGetSetup(hWndC, & CaptureParms, sizeof (CAPTUREPARMS));
CaptureParms.dwRequestMicroSecPerFrame = (DWORD) ( 1.0e6 /
FramesPerSec);
capCaptureSetSetup(hWndC, & CaptureParms, sizeof (CAPTUREPARMS));
12. 捕捉数据并保存
// Set up the capture operation.
capCaptureSequence(hWndC);
// Capture.
capFileSaveAs(hWndC, szNewName);
13. 在视频文件中叠加信息
![](/assets/blank.gif)
![](/assets/blank.gif)
// the video source for preroll and postroll.
CAPINFOCHUNK cic;
// .
// .
// .
cic.fccInfoID = infotypeSMPTE_TIME;
cic.lpData = " 00:20:30:12 " ;
cic.cbData = strlen (cic.lpData) + 1 ;
capFileSetInfoChunk (hwndC, & cic);
14. 添加一个帧回调函数
![](/assets/blank.gif)
![](/assets/blank.gif)
DWORD gdwFrameNum = 0 ;
// FrameCallbackProc: frame callback function.
// hWnd: capture window handle.
// lpVHdr: pointer to structure containing captured
// frame information.
//
LRESULT PASCAL FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
if ( ! hWnd)
return FALSE;
_stprintf_s(gachBuffer, TEXT( " Preview frame# %ld " ), gdwFrameNum ++ );
SetWindowText(hWnd, gachBuffer);
return (LRESULT) TRUE ;
}
15. Adding Callback Functions to an Application
16. Creating a Status Callback Function
17. Creating an Error Callback Function
reference
asic Capture Operations
capCreateCaptureWindow
WM_CAP_ABORT
WM_CAP_DRIVER_CONNECT
WM_CAP_SEQUENCE
WM_CAP_STOP
Capture Windows
CAPSTATUS
capGetDriverDescription
WM_CAP_DRIVER_CONNECT
WM_CAP_DRIVER_DISCONNECT
WM_CAP_GET_STATUS
Capture Drivers
CAPDRIVERCAPS
WM_CAP_DRIVER_GET_CAPS
WM_CAP_DRIVER_GET_NAME
WM_CAP_DRIVER_GET_VERSION
WM_CAP_GET_AUDIOFORMAT
WM_CAP_GET_VIDEOFORMAT
WM_CAP_SET_AUDIOFORMAT
WM_CAP_SET_VIDEOFORMAT
Capture Driver Preview and Overlay Modes
WM_CAP_SET_OVERLAY
WM_CAP_SET_PREVIEW
WM_CAP_SET_PREVIEWRATE
WM_CAP_SET_SCALE
WM_CAP_SET_SCROLL
Capture Driver Video Dialog Boxes
WM_CAP_DLG_VIDEOCOMPRESSION
WM_CAP_DLG_VIDEODISPLAY
WM_CAP_DLG_VIDEOFORMAT
WM_CAP_DLG_VIDEOSOURCE
Audio Format
WM_CAP_GET_AUDIOFORMAT
WM_CAP_SET_AUDIOFORMAT
Video Capture Settings
CAPTUREPARMS
WM_CAP_GET_SEQUENCE_SETUP
WM_CAP_SET_SEQUENCE_SETUP
Capture File and Buffers
CAPTUREPARMS
WM_CAP_FILE_ALLOCATE
WM_CAP_FILE_GET_CAPTURE_FILE
WM_CAP_FILE_SAVEAS
WM_CAP_FILE_SET_CAPTURE_FILE
Directly Using Capture Data
WM_CAP_SEQUENCE_NOFILE
Capture from MCI Device
WM_CAP_SET_MCI_DEVICE
Manual Frame Capture
WM_CAP_SINGLE_FRAME
WM_CAP_SINGLE_FRAME_CLOSE
WM_CAP_SINGLE_FRAME_OPEN
Still-Image Capture
WM_CAP_EDIT_COPY
WM_CAP_FILE_SAVEDIB
WM_CAP_GRAB_FRAME
WM_CAP_GRAB_FRAME_NOSTOP
Advanced Capture Options
WM_CAP_FILE_SET_INFOCHUNK
WM_CAP_GET_USER_DATA
WM_CAP_SET_USER_DATA
Working with Palettes
WM_CAP_EDIT_COPY
WM_CAP_PAL_AUTOCREATE
WM_CAP_PAL_MANUALCREATE
WM_CAP_PAL_OPEN
WM_CAP_PAL_PASTE
WM_CAP_PAL_SAVE
Yielding to Other Applications
WM_CAP_GET_SEQUENCE_SETUP
WM_CAP_SET_CALLBACK_YIELD
WM_CAP_SET_SEQUENCE_SETUP
AVICap Callback Functions
capControlCallback
capErrorCallback
capStatusCallback
capVideoStreamCallback
capWaveStreamCallback
capYieldCallback
WM_CAP_SET_CALLBACK_CAPCONTROL
WM_CAP_SET_CALLBACK_ERROR
WM_CAP_SET_CALLBACK_FRAME
WM_CAP_SET_CALLBACK_STATUS
WM_CAP_SET_CALLBACK_VIDEOSTREAM
WM_CAP_SET_CALLBACK_WAVESTREAM
WM_CAP_SET_CALLBACK_YIELD
基本上可以看到,网上那个非常简单的c#封装实际上还有很多方法没有实现。
转载于:https://www.cnblogs.com/zc22/archive/2009/12/06/1618086.html
关于 web cam 使用自家的摄像头实现 视频捕捉技术 高级篇相关推荐
- web前端入门到实战:CSS 滚动捕捉技术(Scroll Snapping)
CSS 滚动捕捉允许用户完成滚动之后将视口锁定到某个元素的位置.非常适合用来建立下面这样的应用: 基本使用 实现滚动捕捉主要依靠两个属性:容器元素的 scroll-snap-type 属性,以及子元素 ...
- DirectShow编程实现摄像头视频捕捉
前言 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布. DirectShow为多媒体流的捕捉和回放提供了强有力的支持.用Direc ...
- Visual C++编程实现摄像头视频捕捉
摘要:本文主要讲述用Directshow进行视频捕捉(捕捉静态图像)的编程思路,并提供针对摄像头编程的一个视频捕捉类CcaptureVideo和一个示例. 前言 DirectShow是微软公司提供的一 ...
- WEB页面播放大华摄像头视频解决方案
目前在网页上播放大华摄像头视频,有如下2种途径: 1)首选获取摄像头的hls协议地址,H5可直接播放 2)获取摄像头rtsp协议地址,用ffmpeg转换成hls再播放 近期做的一个项目,需要在WEB端 ...
- 通过WEB调用大华网络摄像头
通过WEB调用大华网络摄像头 1.要调用的大华摄像头为Dahua 大华DH-IPC-HFW2100P-0600B 网络摄像机 (白色),摄像头外形如下图所示 2.调用效果如下图所示 3.下载大华网络摄 ...
- flex摄像头连接视频录制
Flex提供了3个类实现与服务器端的通信:HTTPService,ReObject和WebService.另外,我们还可以根据外部中间插件来让Flex与服务器端进行通信,比如Blazeds(Lcds) ...
- php微信调用摄像头拍视频,公众号调用摄像头录制视频
公众号微信网页调用摄像头录制视频,不想用input方法. 找了很久找到了腾讯优图.活体检测示例(http://open.youtu.qq.com/h5_ctl/living_detect),这里面采 ...
- 基于EasyNVR实现RTSP_Onvif监控摄像头Web无插件化直播监控之视频直播网络占用率大如何解决的问题分析
背景说明 由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋.传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCX Web插件进行直播.对于安防 ...
- 使用samba服务在Linux与Windows直接共享文件夹,海康威视网络摄像头录像视频存储到ubuntu服务器
目录 背景 SMB共享介绍 访问共享的命令和方式 本人亲测环境 海康威视网络摄像头录像视频存储到ubuntu服务器 背景 应项目要求,海康威视网络摄像头的监控客户端要在windows系统上,录像视频要 ...
最新文章
- 数学知识--Levenberg-Marquardt算法浅谈
- 基于JSP/SERVLET的省心物流管理
- 随机森林算法demo python spark
- 2010考研全程学习规划简案【推荐】
- JVM内存管理机制和垃圾回收机制
- java 上传 进度条_Ajax上传文件并显示进度条
- STM32——串口通信
- python生成json_Python 生成json文件
- 矩阵迹的性质_机器学习的数学基础 之 矩阵范数 — 我的长度我做主?
- php合图,php合并图片
- Linux 命令(40)—— nohup 命令
- Widget、MainWindow和Dialog的选择使用
- pybind11用python调用C++代码
- jogbuild-common.xml:17: Cannot find /home/tsit/tio-software/jogamp/gluegen/make/gluegen-cpptasks.xml
- android 静默暗转_Android PackageInstaller 静默安装的实现
- Java选择排序(升序和降序)
- 【Docker】给运行的容器添加端口映射
- 地理必修一三大类岩石_中图版高中地理(必修一)知识归纳——第二章
- Chrome隐私设置错误,您的链接不是私密连接
- DTAS棣拓智云-三维公差仿真模拟软件几何尺寸与公差分析软件-尺寸工程:DTAS Talk尺寸联盟参与公益课