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;
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;