Delphi利用avicap32.dll编程控制摄像头实现拍照、录制视频

项目需求:平板电脑(Windows系统)一维/二维码扫描功能;

需求分析:

需要扫描一维/二维码时,分两步实现。

第一步,avicap32.dll或者dspack技术实现静默打开摄像头拍照、保存BMP图片。

第二步,ZXing技术实现对一维/二维码的解析,最终获取到码值。

本篇是利用avicap32.dll技术实现拍照/录制视频的测试Demo。

请看代码:

 unit uMain;

 interface

 uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, RzPanel, RzButton; type
TFrmMain = class(TForm)
gbScreen: TRzGroupBox;
gbOperation: TRzGroupBox;
btnStart: TRzBitBtn;
btnStop: TRzBitBtn;
btnSaveBMP: TRzBitBtn;
btnStartR: TRzBitBtn;
btnSaveAVI: TRzBitBtn;
pMain: TPanel;
procedure btnStartClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnStopClick(Sender: TObject);
procedure btnSaveBMPClick(Sender: TObject);
procedure btnStartRClick(Sender: TObject);
procedure btnSaveAVIClick(Sender: TObject);
private
{ Private declarations }
hWndC: THandle;
public
{ Public declarations }
end; var
FrmMain: TFrmMain;
const WM_CAP_START = WM_USER;
const WM_CAP_STOP = WM_CAP_START + ;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + ;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + ;
const WM_CAP_SAVEDIB = WM_CAP_START + ;
const WM_CAP_GRAB_FRAME = WM_CAP_START + ;
const WM_CAP_SEQUENCE = WM_CAP_START + ;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + ;
const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + ;
const WM_CAP_SET_OVERLAY = WM_CAP_START + ;
const WM_CAP_SET_PREVIEW = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + ;
const WM_CAP_SET_SCALE = WM_CAP_START + ;
const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + ; function capCreateCaptureWindowA(lpszWindowName: PCHAR;
dwStyle: longint; x: integer; y: integer; nWidth: integer;
nHeight: integer; ParentWin: HWND; nId: integer): HWND;
STDCALL EXTERNAL 'AVICAP32.DLL'; implementation {$R *.dfm} procedure TFrmMain.btnStartClick(Sender: TObject);
begin
//开始拍摄
hWndC := capCreateCaptureWindowA('My Own Capture Window', WS_CHILD or WS_VISIBLE, pMain.Left, pMain.Top, pMain.Width, pMain.Height, FrmMain.Handle, );
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, , );
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, , );
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, , );
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, , );
SendMessage(hWndC, WM_CAP_SET_SCALE, , );
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, , );
SendMessage(hWndC, WM_CAP_SET_OVERLAY, , );
SendMessage(hWndC, WM_CAP_SET_PREVIEW, , );
end;
end; procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//程序退出时,自动关闭摄像头
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, , );
end;
end; procedure TFrmMain.btnStopClick(Sender: TObject);
begin
//关闭摄像头
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, , );
hWndC := ;
end;
end; procedure TFrmMain.btnSaveBMPClick(Sender: TObject);
begin
//保存BMP
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_SAVEDIB, , longint(pchar('D:/1.bmp')));
end;
end; procedure TFrmMain.btnStartRClick(Sender: TObject);
begin
//开始录制AVI视频
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, , Longint(pchar('c:/test.avi')));
SendMessage(hWndC, WM_CAP_SEQUENCE, , );
end;
end; procedure TFrmMain.btnSaveAVIClick(Sender: TObject);
begin
//停止录制并保存AVI视频
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_STOP, , );
end;
end; end.

运行效果:

作者:Jeremy.Wu
  出处:https://www.cnblogs.com/jeremywucnblog/

  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Delphi - 利用DLL编程控制摄像头实现拍照、录制视频的更多相关文章

  1. delphi中DLL编程详解

    10.1 Windows的动态链接库原理 动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中,同时用户也可以用LIB程序创建自己的函 ...

  2. Delphi下DLL编程知识(转)

    一.  DLL和系统变量     在 System 单元声明的变量中,有几个对DLL编程有特殊影响.IsLibrary 可以检测代码是执行在应用程序中还是执行在DLL中,在应用程序中 IsLibrar ...

  3. 利用Delphi编程控制摄像头(图)

    你的电脑有没有摄像头?看到别人用QQ玩视屏你会不会去想怎么实现的?这里介绍使用DELPHI使用MS的 AVICAP32.DLL就可轻松的实现对摄像头编程,如果再加上你的网络编程水平,实现一个视屏聊天就 ...

  4. WinForm利用AForge.NET调用电脑摄像头进行拍照和视频

    当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...

  5. 在WPF中使用AForge.net控制摄像头拍照

    原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...

  6. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  7. iOS开发----音频播放、录音、视频播放、拍照、视频录制

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

  8. 音频播放、录音、视频播放、拍照、视频录制-b

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

  9. iOS音频播放、录音、视频播放、拍照、视频录制

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

随机推荐

  1. Apicloud微信支付iOS可以,安卓返回-1的之避坑指南

    相信各位小伙伴在接入微信支付的时候,一定遇到过返回-1的这个问题,说实话,这个问题真的很恶心,微信开放平台提供的文档在关于-1这个问题的描述(可能的原因:签名错误.未注册APPID.项目设置APPID ...

  2. Linux IO 概念(2)【转】

    转自:https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇IO底层的概念中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从l ...

  3. 3-14 Pandas绘图

      1.魔法指令:%matplotlib inline :数据画图 In [1]: %matplotlib inline import pandas as pd In [2]: import nump ...

  4. 安装教程-VMware 12 虚拟机软件的安装

    VMware 12 虚拟机软件的安装 1.实验描述 安装虚拟化软件,在物理机中搭建各种不同操作系统,为学习提供各种平台. 2.实验环境 物理机系统:Windows 10 企业版 3.实验工具 [VMw ...

  5. Unity Built-In Shader造成的运行时内存暴涨

    在某个PC项目中使用了大量的材质球, 并且都使用了自带的Standard Shader, 在编辑器运行的时候, 一切良好, 运行内存只在1G左右, 然而在进行AssetBundle打包之后, EXE运 ...

  6. torchline:让Pytorch使用的更加顺滑

    torchline地址:https://github.com/marsggbo/torchline 相信大家平时在使用Pytorch搭建网络时,多少还是会觉得繁琐,因为我们需要搭建数据读取,模型,训练 ...

  7. 设备树的规范(dts)

    设备树的官方文档: https://www.devicetree.org/specifications/ 一.理论部分 如何看下面这张图: 1)从根节点开始看起,即 / 2)在根节点中有属性以及设备节 ...

  8. 201971010131-张兴盼《面向对象程序设计(java)》第十二周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  9. Linux下Nginx的安装(二)

    一.安装Nginx ## 安装前准备 ## #GNU编译器集合 #Nginx编译需要PCRE #在Nginx的各种模块中需要使用gzip压缩 #在Nginx中,如果服务器提供安全网页时则会用到Open ...

  10. 关于对STL容器重载运算符的问题

    注意:下文中vector数组指的是每个数组元素都是一个vector的数组 大部分有序STL容器都重载了小于号,且比较方式是对容器中元素进行字典序比较. 此时如果你写\(bool\ operator&l ...