delphi 用AVICap实现视频捕获 有个问题 请大家帮忙看看?
delphi 用AVICap实现视频捕获 有个问题 请大家帮忙看看? 捕获不到图像 是黑色的
下面是代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
hWndC : THandle;
{ 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;
const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63;
const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51;
const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50;
const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
const WM_CAP_SET_SCALE=WM_CAP_START+ 53;
const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52;
function capCreateCaptureWindowA(lpszWindowName : PCHAR; dwStyle : longint; x : integer;
y : integer;nWidth : integer;nHeight : integer;ParentWin : HWND;
nId : integer): HWND;STDCALL EXTERNAL 'AVICAP32.DLL';
procedure TForm1.btn1Click(Sender: TObject);
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
begin
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
end.
[最优解释]
代码没有问题。
换个摄像头吧,软件兼容问题!
[其他解释]
我用DSPack这套组件没黑屏
用别的组件也黑屏了。。
procedure Tform1.startcap;
begin
SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
if SysDev.CountFilters > 0 then
begin
Filter.BaseFilter.Moniker := SysDev.GetMoniker(0);
FilterGraph.Active:=true;
with FilterGraph as ICaptureGraphBuilder2 do
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
FilterGraph.Play;
SysDev.Free;
end
else
begin
Exit;
Timer1.Enabled:=False;
end;
end;
[其他解释]
参考下这个源码我试过,不黑屏。
http://download.csdn.net/source/2867577
DirectX Delphi Webcam Capture Demos,delphi利用DirectX操作摄像头的演示程序,功能比较全面,值得研究下
[其他解释]
procedure TForm1.btn1Click(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
begin
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
end;
end.现在可以运行成功 但是点击按钮出来的是黑色的 捕捉不到图像啊 我的摄像头是可以用的 用amcap测试是正常的
请大家帮忙看看这段代码问题出在哪里?
[其他解释]
哦 我再试试看 是不是这样的VFW之类的程序已经淘汰了啊
[其他解释]
我对这个接触不多,但我试过,很多VFW控件都挑摄像头。
CnPack里面的摄像头控件也挑摄像头。有人说是摄像关分辨率的问题,但我怎么设也没有用。换个摄像头就好了。
[其他解释]
但我见过一个VBw的用摄像头照像的程序,没有带DLL,只有一个EXE。它不管哪个摄像头都好用,不知道用的什么控件?
[其他解释]
哦 这么好哦 我怎么没碰到过呢
[其他解释]
看看这个就是
http://www.duote.com/soft/12228.html
[其他解释]
这里传输,上面启动捕获
procedure Tcapthread.Execute;
var
Jpeg : TJPEGImage;
bmp,bmp2:TBitmap;
needstream:TMemoryStream;
Flist:TStringStream;
begin
try
needstream:=TMemoryStream.Create;
bmp:=TBitmap.Create;
bmp2:=TBitmap.Create;
Jpeg := TJPEGImage.Create;
form1.SampleGrabber.GetBitmap(bmp);
bmp2.Width:=460;
bmp2.Height:=350;
bmp2.Canvas.StretchDraw(bmp2.Canvas.ClipRect,bmp);
Jpeg.Assign(bmp);
jpeg.CompressionQuality:=caphuazhi;
Jpeg.Compress;
Jpeg.SaveToStream(needstream);
needstream.Position := 0;
//传输
Flist:=TStringStream.Create('');
Flist.WriteString('StartCap');
if needstream.Size=0 then exit;
if form1.IdTCPClient1.Connected=True then
begin
if form1.IdTCPClient1.Connected=false then form1.IdTCPClient1.Disconnect
else
begin
try
form1.IdTCPClient1.WriteInteger(Flist.Size);
form1.IdTCPClient1.WriteStream(Flist,True,False);
form1.IdTCPClient1.WriteInteger(needstream.Size);
form1.IdTCPClient1.WriteStream(needstream,True,False);
except;
end;
end;
end
else
begin
if Form1.TcpOnline.Connected then
begin
form1.IdTCPClient1.Connect(2000);
end;
end;
finally
bmp.Free;
bmp2.Free;
needstream.Free;
Jpeg.Free;
Flist.Free;
end;
end;
[其他解释]
谢谢大家