delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
关于视频网络传输的 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061207002859115.html
第一次用delphi  
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,vfw,jpeg,   ExtCtrls,   StdCtrls,   IdBaseComponent,   IdComponent,  
      IdUDPBase,   IdUDPClient;  
   
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Button2:   TButton;  
          Panel1:   TPanel;  
          IdUDPClient1:   TIdUDPClient;  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
          CapWnd:THandle;   //定义捕捉窗句柄  
          CapParms:TcaptureParms;   //用于设置设备属性的结构变量  
          BMPINFO:TBitmapInfo;   //BMP图像信息  
   
  implementation  
   
  {$R   *.dfm}  
  function   FrameCallBack(hWnd:   HWND;   lpVHdr:   PVIDEOHDR):   LongInt;stdcall;  
    var  
          hd:Thandle;  
          jpg:TJpegImage;  
          memStream   :TMemoryStream;  
          Bitmap:TBitmap;  
          begin   //将数据显在Image,  
          Bitmap:=TBitmap.Create;  
          Bitmap.Width   :=BMPINFO.bmiHeader.biWidth;  
          //   New   size   of   Bitmap  
          Bitmap.Height:=BMPINFO.bmiHeader.biHeight;  
          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   :=   10;  
          //jpg压缩质量  
          jpg.JPEGNeeded;  
          jpg.Compress;  
          jpg.SaveToStream(memStream);  
          jpg.Free;  
          //因为UDP数据包有大小限制,这里如果超出部分,就没有传输,完全可以发几次发出去  
          Form1.IdUDPClient1.BroadcastEnabled:=true;//用广播功能  
          if   memStream.Size>Form1.IdUDPClient1.BufferSize   then  
          //向192.168.0.X网段广播,端口   9001  
          Form1.IdUDPClient1.SendBuffer('192.168.0.255',9001,memStream.Memory^,Form1.IdUDPClient1.BufferSize)  
          else  
          Form1.IdUDPClient1.SendBuffer('192.168.0.255',9001,memStream.Memory^,memStream.Size);  
          memStream.Free;  
          Bitmap.Free;  
          end;  
   
   
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
    CapWnd   :=   capCreateCaptureWindow('我的窗口',   WS_VISIBLE   or   WS_CHILD,//窗口样式  
          0,   //X坐标  
          0,   //Y坐标  
          panel1.Width,   //窗口宽  
          panel1.Height,   //窗口高  
          panel1.handle,   //窗口句柄  
          0);   //通常为0  
          if   CapWnd   =   0   then   exit;   //定义帧捕捉回调函数  
          CapSetCallbackOnFrame(CapWnd,FrameCallBack);  
          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.Button2Click(Sender:   TObject);  
          begin   capCaptureAbort(CapWnd);   //停止捕捉  
          capDriverDisconnect(CapWnd);   //将捕捉窗同驱动器断开  
          end;  
  end;  
  编译出错如下:  
   
  [警告]   Unit1.pas(66):   Return   value   of   function   'FrameCallBack'   might   be   undefined  
  [错误]   Unit1.pas(80):   Incompatible   types:   'Cardinal'   and   'Integer'  
  [错误]   Unit1.pas(101):   Declaration   expected   but   end   of   file   found  
  [致命错误]   Project1.dpr(6):   Could   not   compile   used   unit   'Unit1.pas'  
   
  能帮改改吗!

TcaptureParms   这个结构变量哪来的   你有无自己定义  
   
  你用的别人封装好的控件   有没有把厂方提供DLL安装啊      
  ActiveX控件有无把环境变量加载进去   有无安装OCX控件

这个不是控件  
  是microsoft   提供的video   for   windows     ,  
  即vfw.pas.  
  TcaptureParms   结构变量来自   vfw.pas  
  而且用TcaptureParms   CapParms   编译也是通过的,  
   
   
  因为在bcb中   #include   vfw.h  
 

VFW不好用的  
  都淘汰的  
  现在是DirectShow的  
   
  一般用TCP外加速度控制,效果不错~  
  UDP太麻烦的

posted on 2008-09-23 09:36 delphi2007 阅读(258) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。