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. linux 进程通信之 mmap

    一,管道PIPE 二,FIFO通信 三,mmap通信 创建内存映射区. #include <sys/mman.h> void *mmap(void *addr, size_t length ...

  2. 08webpack-复习

    在调用loader的时候 都是从右往左进行加载的哦 //下面是现在学的webpack的配置文件哦 const path = require("path"); //路径模块 //第2 ...

  3. MP支持的主键策略

    MP 支持多种主键策略 默认是推特的“” 雪花算法“” ,也可以设置其他策略下面我演示主键策略使用 MP的主键定义在一个一个枚举类中 源码如下 public enum IdType { AUTO(0) ...

  4. 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...

  5. 【转】Spring全家桶

    Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶.它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflo ...

  6. TensorFlow语法点滴

    1. tf.variable_scope生成一个上下文管理器,用于获取已经生成的变量 with tf.variable_scope('pnet'): data = tf.placeholder(tf. ...

  7. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  8. Install docker to Redhat 7

    1)   sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2) s ...

  9. 11/10 <priorityQueue> 215 347

    215. Kth Largest Element in an Array 快速排序法,选择一个数,比这个数大的交换到左边,比这个数小的交换到右边. class Solution { public in ...

  10. [LeetCode] 30. Substring with Concatenation of All Words 串联所有单词的子串

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...