我用vfw 写的一个视频会议
参照前人的一些代码
但是 我的 DrawDibDraw  这个函数 貌似一直不管用,都不将数据 画到 bitmap 中去
客户端得到的图片都是空白的 
代码如下 : 客户端
DrawDibDraw
unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls, VFW, IdBaseComponent, IdComponent, IdUDPBase,
    IdUDPClient, jpeg, pngimage;type
    TForm1 = class(TForm)
        pnl1: TPanel;
        btn1: TButton;
        btn2: TButton;
        IdUDPClient1: TIdUDPClient;
        mmo1: TMemo;
        btn3: TButton;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
        procedure btn3Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;var
    Form1: TForm1;    CapWnd: THandle;                    //定义捕捉窗句柄
    CapParms: TcaptureParms;            //用于设置设备属性的结构变量
    BMPINFO: TBitmapInfo;               //BMP图像信息
    lpVHdr: PVIDEOHDR;
  
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 FrameCallBack(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall;
var
    hd: THandle;
    jpg: TJpegImage;
    memStream: TMemoryStream;
    Bitmap: TBitmap;
    png: TPNGObject;
    mystream: TMemoryStream;
    i: Integer;begin                                   //将数据显在Image,    Bitmap := TBitmap.Create;
    // New size of Bitmap
   hd := DrawDibOpen;
   DrawDibDraw(hd, Bitmap.Canvas.Handle, 0, 0, BMPINFO.BmiHeader.biwidth,
        BMPINFO.bmiheader.biheight, @BMPINFO.bmiHeader, lpVHdr^.lpData, 0, 0,
       BMPINFO.bmiHeader.biWidth, BMPINFO.bmiHeader.biheight, 0);
   DrawDibClose(hd);
     //发送数据
    memStream := TMemoryStream.Create;
      jpg := TJpegImage.Create;
    jpg.Assign(Bitmap);
     jpg.CompressionQuality :=15;
    //jpg压缩质量
    jpg.JPEGNeeded;
    jpg.Compress;
    jpg.SaveToStream(memStream);
    jpg.Free;
    //因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去
    Form1.IdUDPClient1.BroadcastEnabled := true; //用广播功能
    if memStream.Size > Form1.IdUDPClient1.BufferSize then
        Form1.IdUDPClient1.SendBuffer('192.168.1.255', 9001, memStream.Memory^, Form1.IdUDPClient1.BufferSize) //向192.168.0.X网段广播,端口 9001
    else
        Form1.IdUDPClient1.SendBuffer('192.168.1.255', 9001, memStream.Memory^, memStream.Size);
    memStream.Free;
    Bitmap.Free;
   if    FileExists('abc' + '.bmp') then
   begin
     DeleteFile('abc' + '.bmp');
   end;
end;procedure TForm1.btn1Click(Sender: TObject);
begin
    CapWnd := capCreateCaptureWindow('我的窗口', WS_VISIBLE or WS_CHILD, //窗口样式
        0,                              //X坐标
        0,                              //Y坐标
        pnl1.Width,                     //窗口宽
        pnl1.Height,                    //窗口高
        pnl1.handle,                    //窗口句柄
        0);                             //通常为0
    if CapWnd = 0 then exit;            //定义帧捕捉回调函数
    CapSetCallbackOnFrame(CapWnd, FrameCallBack);
    BMPINFO.bmiHeader.biWidth := 500;
    BMPINFO.bmiHeader.biHeight:= 600;
    CapParms.dwRequestMicroSecPerFrame := 1;
    CapParms.fLimitEnabled := FALSE;
     CapParms.fCaptureAudio := FALSE;
     CapParms.fMCIControl := FALSE;
     CapParms.fYield := TRUE;
     CapParms.vKeyAbort := VK_ESCAPE;
     CapParms.fAbortLeftMouse := False;
     CapParms.fAbortRightMouse := FALSE; //让设置生效
    CapCaptureSetSetup(capWnd, @CapParms, sizeof(TCAPTUREPARMS));
   CapPreviewRate(capWnd, 33);         //设置预览视频的频率
    CapCaptureSequenceNoFile(capWnd);   //如果要捕捉视频流,则要使用函数来指定不生成文件,不然会自动生成AVI文件
    CapDriverConnect(CapWnd, 0);        //连接摄像头设备,第二个参数是个序号,当系统中装有多个显示驱动程序时,其值分别依次为0到总个数如果有多个摄像头,那么就是0->1->2 capGetVideoFormat(capWnd, @BMPINFO,sizeof(TBitmapInfo)); //取得视频图像数据头
    CapPreviewScale(capWnd, TRUE);      //是否缩放
    CapOverlay(capWnd, true);           //指定是否使用叠加模式,true为使用,否则为false
   CapPreview(capWnd, true);
end;procedure TForm1.btn2Click(Sender: TObject);
begin
    capCaptureAbort(CapWnd);            //停止捕捉
    capDriverDisconnect(CapWnd);        //将捕捉窗同驱动器断开end;procedure TForm1.btn3Click(Sender: TObject);
begin
    //mmo1.Lines.Add(vstr);
end;end.
客户端 :  
unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Variants, Classes,
    Graphics, Controls, Forms, Dialogs, StdCtrls,
    IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, ExtCtrls, jpeg,
    IdSocketHandle;type
    TForm1 = class(TForm)
        img1: TImage;
        idpsrvr1: TIdUDPServer;
        btn1: TButton;
    pnl1: TPanel;
        procedure idpsrvr1UDPRead(Sender: TObject; AData: TStream;
            ABinding: TIdSocketHandle);
        procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;var
    Form1: TForm1;implementation{$R *.dfm}procedure TForm1.idpsrvr1UDPRead(Sender: TObject; AData: TStream;
    ABinding: TIdSocketHandle);
    var jpg: TJpegImage;
        j : Integer;
begin    begin
         try
             jpg := TJpegImage.Create;
        jpg.LoadFromStream(Adata);         img1.Picture.Graphic := jpg;        jpg.Free;
        except
    end;end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
idpsrvr1.DefaultPort := 9001;       //接收端口
idpsrvr1.Active := true;          //启用end;procedure TForm1.FormCreate(Sender: TObject);
begin
  img1.Parent := pnl1;
end;end.