首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi 用AVICap实现视频捕获 有个有关问题 请大家帮忙看看

2012-12-14 
delphi 用AVICap实现视频捕获 有个问题 请大家帮忙看看?delphi 用AVICap实现视频捕获 有个问题 请大家帮忙

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。它不管哪个摄像头都好用,不知道用的什么控件?
[其他解释]
引用:
但我见过一个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;


[其他解释]
谢谢大家 

热点排行