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