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. STM32芯片命名规则

  2. Linux内核编程、调试技巧小集【转】

    转自:https://www.cnblogs.com/arnoldlu/p/7152488.html 1. 内核中通过lookup_symbol_name获取函数名称 内核中很多结构体成员是函数,有时 ...

  3. Ubuntu18.04.2下安装 RTX2080 Nvidia显卡驱动

    转载请注明出处:BooTurbo  https://www.cnblogs.com/booturbo/p/11261903.html 不久前入手了蓝天P870TM1G准系统,配置如下: 1. Z370 ...

  4. 简简单单,jquery中,使用checkbox控制div的显示与隐藏

    今天开发代码时,发现好久不用jquery就生疏了. 所以作这个记录, 使用checkbox控制div的显示与隐藏. 一,html代码处: <input type="checkbox&q ...

  5. MySQL中建立Oracle中SCOTT数据示例

    1.创建 scott 数据库 CREATE DATABASE scott; 2.创建 scott 数据库中的 dept 表 CREATE TABLE dept( deptno INT UNSIGNED ...

  6. 代码审计-md5()函数

    <?php error_reporting(0); $flag = 'flag{test}'; if (isset($_GET['username']) and isset($_GET['pas ...

  7. Sharding-JDBC 学习资料

    学习资料 网站 官网 https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/ 基于 Docker 的 M ...

  8. zz先睹为快:神经网络顶会ICLR 2019论文热点分析

    先睹为快:神经网络顶会ICLR 2019论文热点分析 - lqfarmer的文章 - 知乎 https://zhuanlan.zhihu.com/p/53011934 作者:lqfarmer链接:ht ...

  9. 关于==和equals的区别和联系,面试这么回答就可以

    长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你<关于==和equals的区别>,该怎么回答完美呢?可以这样说 总结的来说: 1) ...

  10. <LinkedList> 160

    160. Intersection of Two Linked Lists 分别从AB循环两次.如果第一次没循环到,第二次就会在节点相遇. public class Solution { public ...