delphi - 在 Delphi 7 中使用 avicap32 从网络摄像头捕获图像
问题描述
我在我的项目中使用 Delphi 7。
该项目的目的是从网络摄像头捕获图像。该程序似乎检测到网络摄像头,并显示一个窗口,我可以在其中选择所需的网络摄像头,但屏幕只是黑色,没有显示任何内容。
代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
SaveDialog1: TSaveDialog;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
hWndC : THandle;
CapturingAVI : bool;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const WM_CAP_START = WM_USER;
const WM_CAP_STOP = WM_CAP_START + 68;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
const WM_CAP_SAVEDIB = WM_CAP_START + 25;
const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
const WM_CAP_SEQUENCE = WM_CAP_START + 62;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
Function capCreateCapt(dwStyle : longint; x : integer; y : integer; nWidth : integer;nHeight : integer;ParentWin : HWND; nId : integer): HWND; STDCALL EXTERNAL 'AVICAP32.DLL';
procedure TForm1.FormCreate(Sender: TObject);
begin
CapturingAVI := false;
hWndC := 0;
SaveDialog1.Options := [ofHideReadOnly, ofNoChangeDir, ofPathMustExist]
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window', WS_CHILD or WS_VISIBLE, Panel1.Left, Panel1.Top, Panel1.Width, Panel1.Height, Form1.Handle, 0);
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0 );
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if hWndC <> 0 then begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_START, 0, 0);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
end;
end.
解决方案
您的声明capCreateCaptureWindowA()
是错误的,如果您希望网络摄像头显示出现在TPanel
.
试试这个:
function capCreateCaptureWindowA(const lpszWindowName : PAnsiChar; dwStyle : DWORD; x : integer; y : integer; nWidth : integer; nHeight : integer; hwwndParent : HWND; nId : integer): HWND; stdcall; external 'AVICAP32.DLL';
procedure TForm1.Button1Click(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window', WS_CHILD or WS_VISIBLE, 0, 0, Panel1.Width, Panel1.Height, Panel1.Handle, 0);
...
end;
推荐阅读
- java - 从 Java 源代码生成 AST 报告而不实际运行它
- python - Pandas - 如何使用来自 DateTimeIndex 列表的索引添加新的空行?
- apache - htaccess 中的 RewriteRules 用于干净的 URL 解析并从完整 URL 重定向到干净的 URL
- javascript - HTML/CSS 按钮在移动设备上表现怪异(Chrome/Android)
- android - 如何设置高度以适合整个屏幕?
- json - 这个错误代码是什么意思?JSONDecodeError:期望值
- python - 在 Python 中使用 Hovertool 和 Bokeh
- javascript - html - 自动匹配上面元素的宽度
- python - Python datetime:十进制数的 strftime() 代码
- ios - iOS:删除 App Store Connect 中的 Test Flight 构建?