关于控制摄像头的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 星期一
  • 开始时间 开始时间

星期一

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TfrmVideo.StartCapture();
var
CapDrvCaps: TCAPDRIVERCAPS;
begin
CapHwnd := CapCreateCaptureWindow ('My Video',WS_CHILD or WS_VISIBLE ,Panel1.Left+TntPanel1.Left,Panel1.Top+TntPanel1.Top,TntPanel1.Width,TntPanel1.Height,Handle,0);
if CapHwnd<>0 then
begin
//capSetCallbackOnFrame(CapHwnd,@TfrmVideo.OnCapFrame);
if not capDriverConnect(CapHwnd, 0) then //设置采集窗口是否能与驱动器连接
TntPanel1.Caption := 'Can'' find camera';
//设置采集数据的格式
capCaptureGetSetup(CapHwnd, @CapParam, sizeof(CapParam)); //得到当前采集的属性
CapParam.fCaptureAudio := False; //是否采集音频
CapParam.fAbortLeftMouse := False; //表示是否由鼠标点击退出
CapParam.fAbortRightMouse := False;
CapParam.fYield := True;
CapParam.dwRequestMicroSecPerFrame := 1000000 div 25;//设置帧数,当前为25帧,默认为15帧
CapCaptureSetSetup(CapHwnd, @CapParam,SizeOf(CapParam));//设置采集的属性
CapPreviewScale(CapHwnd,True);
CapPreviewRate(CapHwnd,66);
//capDriverGetCaps(CapHwnd, @CapDrvCaps, sizeof (CapDrvCaps));
//if (CapDrvCaps.fHasOverlay) then
// capOverlay(CapHwnd, TRUE)
//else
//begin
// capOverlay(CapHwnd,False);
CapPreview(CapHwnd,True);
//end;
//如果要捕获视频流,则要使用函数指定不生成文件。否则将会自动生成AVI文件
CapCaptureSequenceNoFile(CapHwnd);
end;
end;

procedure TfrmVideo.StopCapture();
begin
if CapHwnd <> 0 then
begin
//停止捕获
Cappreview(CapHwnd,False);
capCaptureAbort(CapHwnd);
//将捕获窗同驱动器断开
capDriverDisconnect(CapHwnd);
CapHwnd := 0;
end;
end;

这是看VFW例子来的,可是StopCapture不能停止PREVIEW,显示图像的PANEL至少闪了一下而已,而摄像头的工作灯还是亮着的。

什么原因啊?
 
procedure TfrmVideo.StartCapture();
var
CapDrvCaps: TCAPDRIVERCAPS;
begin
CapHwnd := CapCreateCaptureWindow ('My Video',WS_CHILD or WS_VISIBLE ,Panel1.Left+TntPanel1.Left,Panel1.Top+TntPanel1.Top,TntPanel1.Width,TntPanel1.Height,Handle,0);
if CapHwnd<>0 then
begin
//capSetCallbackOnFrame(CapHwnd,@TfrmVideo.OnCapFrame);
if not capDriverConnect(CapHwnd, 0) then //设置采集窗口是否能与驱动器连接
TntPanel1.Caption := 'Can'' find camera';
//设置采集数据的格式
capCaptureGetSetup(CapHwnd, @CapParam, sizeof(CapParam)); //得到当前采集的属性
CapParam.fCaptureAudio := False; //是否采集音频
CapParam.fAbortLeftMouse := False; //表示是否由鼠标点击退出
CapParam.fAbortRightMouse := False;
CapParam.fYield := True;
CapParam.dwRequestMicroSecPerFrame := 1000000 div 25;//设置帧数,当前为25帧,默认为15帧
CapCaptureSetSetup(CapHwnd, @CapParam,SizeOf(CapParam));//设置采集的属性
CapPreviewScale(CapHwnd,True);
CapPreviewRate(CapHwnd,66);
//capDriverGetCaps(CapHwnd, @CapDrvCaps, sizeof (CapDrvCaps));
//if (CapDrvCaps.fHasOverlay) then
// capOverlay(CapHwnd, TRUE)
//else
//begin
// capOverlay(CapHwnd,False);
CapPreview(CapHwnd,True);
//end;
//如果要捕获视频流,则要使用函数指定不生成文件。否则将会自动生成AVI文件
CapCaptureSequenceNoFile(CapHwnd);
end;
end;

procedure TfrmVideo.StopCapture();
begin
if CapHwnd <> 0 then
begin
//停止捕获
Cappreview(CapHwnd,False);
capCaptureAbort(CapHwnd);
//将捕获窗同驱动器断开
capDriverDisconnect(CapHwnd);
CapHwnd := 0;
end;
end;

这是看VFW例子来的,可是StopCapture不能停止PREVIEW,显示图像的PANEL至少闪了一下而已,而摄像头的工作灯还是亮着的。

什么原因啊?
 
在 CapHwnd := 0; 前面加上 DestroyWindow(CapHwnd);
 
不是这个原因,我发现CapCaptureSequenceNoFile(CapHwnd)这个过程不执行就可以停止。难道capCaptureAbort或者capCaptureStop不是停止捕捉的意思?
 
haishengye@126.com
 
后退
顶部