在网络上进行摄像头视频通讯[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 jasonke 的 blog

        dwbufferlength      : dword;  // 数据buffer长度
        dwbytesused         : dword;               
        dwtimecaptured      : dword;  // 时间长度(毫秒)
        dwuser              : dword;               
        dwflags             : dword;               
        dwreserved          : array[0..3] of dword;
    end;
    
    在回调函数中, 只用到了视频函数: icseqcompressframe,可以看到此函数传入了capvar参数,这个参数是由我们先前看到的initcaptureparams函数产生,下面代码来实现:
    function initcaptureparams : boolean;
    begin
      result := false;
 
      //初始化capvar
      zeromemory(@capvar,sizeof(tcompvars));

      capvar.cbsize:=sizeof(capvar); //必须指定cbsize为tcompvars结构大小
      capvar.dwflags:=icmf_compvars_valid;

      capvar.cbstate:=0;
 
      //fcchandler代表压缩编码类型,我们使用的是divx的编码器
      capvar.fcchandler:=mmiofourcc('d','i','v','x');
      capvar.fcctype:=ictype_video;

     
      //正式连接编码器
      capvar.hic:=icopen(ictype_video, capvar.fcchandler, icmode_compress);
    
      if (capvar.hic>0) then
      begin

        outformatsize:=iccompressgetformatsize(capvar.hic,@bmpininfo.bmiheader);
        getmem(bmpoutinfo,outformatsize);
        
        //我们可以通过初始化时得到的bmpininfo来获取压缩传出图像头bmpoutinfo
        iccompressgetformat(capvar.hic,@bmpininfo.bmiheader,@bmpoutinfo^.bmiheader);
        outbuffersize:=iccompressgetsize(capvar.hic,@bmpininfo.bmiheader,@bmpoutinfo^.bmiheader);
        icseqcompressframestart(@capvar, @bmpininfo);
        result := true;
      end
      else
      begin
        showmsg('请先安装视频压缩编码器');
        exit;
      end
    end;

    使用之后,如果要断开编码器连接,是这样调用的:
    if (capvar.hic > 0) then
    begin
       icseqcompressframeend(@capvar);
       iccompressorfree(@capvar);
       icclose(capvar.hic);
    end;

    于是,服务端的摄像头数据捕捉连接就完成了,那么对于客户端是乍样进行视频数据解压呢?这个问题当然还是通过ic函数解决,但你必须先把服务端上的bmpoutinfo和capvar传输到客户端才行。
   
    接着,一起来看看客户端的图像显示过程:
    //先用取得的capvar来连接视频编码器
    capvar.hic := icopen(capvar.fcctype,capvar.fcchandler,icmode_decompress);
   
    //成功后,用服务器传来的bmpoutinfo当作客户端的bmpininfo来取得解压输出的图像头bmpoutinfo

    outformatsize:=icdecompressgetformatsize(capvar.hic,@bmpininfo.bmiheader);
    getmem(bmpoutinfo,outformatsize);
    zeromemory(bmpoutinfo,outformatsize);

    icdecompressgetformat(capvar.hic, @bmpininfo.bmiheader, @bmpoutinfo^.bmiheader);

    outbuffersize:=bmpoutinfo^.bmiheader.bisizeimage;
    getmem(outbuffer,outbuffersize);

    zeromemory(outbuffer,outbuffersize);

本文关键:在网络上进行摄像头视频通讯
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top