为什么使用VFW开发的视频显示(摄像头),总是出现显示滞后的现象(仅仅显示)?该怎么解决
为什么使用VFW开发的视频显示(摄像头),总是出现显示滞后的现象(仅仅显示)?
我试过网上很多用VFW的程序,都是这种情况!人在摄像头前摆手时,就能看出图像明显的滞后,但是用AMCAP显示时就很流畅,还试了directShow的程序也很流畅,这是为什么原因?是需要一些设置还是VFW的原因.有什么解决方法?
其中代码:
CWnd *pWnd=AfxGetMainWnd()-> GetDlgItem(IDC_VIDEO);//得到预示窗口指针
CRect rect;
pWnd-> GetWindowRect(&rect); // 得到窗口大小
m_hCapWnd=capCreateCaptureWindow((LPTSTR)TEXT( "视频捕捉测试程序 "),
WS_CHILD|WS_VISIBLE|WS_EX_CLIENTEDGE|WS_EX_DLGMODALFRAME,
0,0,rect.Width(),rect.Width(),
pWnd-> GetSafeHwnd(),0); // 设置预示窗口
ASSERT(m_hCapWnd);
if(capDriverConnect(m_hCapWnd,0))
{
// 连接第0 号驱动器
m_bInit=TRUE;
//得到驱动器的性能
capDriverGetCaps(m_hCapWnd,sizeof(CAPDRIVERCAPS), &m_CapDrvCap);
if(m_CapDrvCap.fCaptureInitialized)
{// 如果初始化成功
capGetStatus(m_hCapWnd, &m_CapStatus,sizeof(m_CapStatus)); // 得到驱动器状态
capPreviewRate(m_hCapWnd,30); // 设置预示帧频
capPreview(m_hCapWnd,TRUE); // 设置预示方式
}
else{// 初始化未成功
AfxMessageBox( "视频捕捉卡初始化失败! ");
AfxGetMainWnd()-> PostMessage(WM_CLOSE);
}
}
else{// 未能连接到驱动器
AfxMessageBox( "与视频捕捉卡连接失败! ");
// AfxGetMainWnd()-> PostMessage(WM_CLOSE);
}
2.还有一个现象当在别的按钮中执行: capCaptureSequence(m_hCapWnd); // 捕捉到文件图像反而流畅了!这又是为什么?
------解决方案--------------------
不懂
帮你顶
------解决方案--------------------
仔细研读一下AMCAP的代码吧。
------解决方案--------------------
VFW缓冲经常会很慢
除非内存很大...
------解决方案--------------------
VFW的预览好像是单独开窗口,将获得的数据通过内存缓存重新显示出来的
所以往往速度慢
amcap中对具有preview——pin的设备是直接连接在该pin上进行显示
------解决方案--------------------
stop后调用capSetCallbackOnVideoStream取消callback了吗?
------解决方案--------------------
VFW的方式已经落伍了,都在使用directshow的方式!
------解决方案--------------------
AMCAP好像用得是dxshow吧。
我感觉好像差不多样,关键看视频头。呵呵
------解决方案--------------------
关键问题是你摄像头芯片及设置,207 305等芯片较差,在较亮情况下速度尚可。
如果不用自动调整就不会太慢了。
这个不是VFW问题
我试过网上很多用VFW的程序,都是这种情况!人在摄像头前摆手时,就能看出图像明显的滞后,但是用AMCAP显示时就很流畅,还试了directShow的程序也很流畅,这是为什么原因?是需要一些设置还是VFW的原因.有什么解决方法?
其中代码:
CWnd *pWnd=AfxGetMainWnd()-> GetDlgItem(IDC_VIDEO);//得到预示窗口指针
CRect rect;
pWnd-> GetWindowRect(&rect); // 得到窗口大小
m_hCapWnd=capCreateCaptureWindow((LPTSTR)TEXT( "视频捕捉测试程序 "),
WS_CHILD|WS_VISIBLE|WS_EX_CLIENTEDGE|WS_EX_DLGMODALFRAME,
0,0,rect.Width(),rect.Width(),
pWnd-> GetSafeHwnd(),0); // 设置预示窗口
ASSERT(m_hCapWnd);
if(capDriverConnect(m_hCapWnd,0))
{
// 连接第0 号驱动器
m_bInit=TRUE;
//得到驱动器的性能
capDriverGetCaps(m_hCapWnd,sizeof(CAPDRIVERCAPS), &m_CapDrvCap);
if(m_CapDrvCap.fCaptureInitialized)
{// 如果初始化成功
capGetStatus(m_hCapWnd, &m_CapStatus,sizeof(m_CapStatus)); // 得到驱动器状态
capPreviewRate(m_hCapWnd,30); // 设置预示帧频
capPreview(m_hCapWnd,TRUE); // 设置预示方式
}
else{// 初始化未成功
AfxMessageBox( "视频捕捉卡初始化失败! ");
AfxGetMainWnd()-> PostMessage(WM_CLOSE);
}
}
else{// 未能连接到驱动器
AfxMessageBox( "与视频捕捉卡连接失败! ");
// AfxGetMainWnd()-> PostMessage(WM_CLOSE);
}
2.还有一个现象当在别的按钮中执行: capCaptureSequence(m_hCapWnd); // 捕捉到文件图像反而流畅了!这又是为什么?
------解决方案--------------------
不懂
帮你顶
------解决方案--------------------
仔细研读一下AMCAP的代码吧。
------解决方案--------------------
VFW缓冲经常会很慢
除非内存很大...
------解决方案--------------------
VFW的预览好像是单独开窗口,将获得的数据通过内存缓存重新显示出来的
所以往往速度慢
amcap中对具有preview——pin的设备是直接连接在该pin上进行显示
------解决方案--------------------
stop后调用capSetCallbackOnVideoStream取消callback了吗?
------解决方案--------------------
VFW的方式已经落伍了,都在使用directshow的方式!
------解决方案--------------------
AMCAP好像用得是dxshow吧。
我感觉好像差不多样,关键看视频头。呵呵
------解决方案--------------------
关键问题是你摄像头芯片及设置,207 305等芯片较差,在较亮情况下速度尚可。
如果不用自动调整就不会太慢了。
这个不是VFW问题