WINCE6.0基于DirectShow架构的camera驱动使用高分辨率(2048*1535)打开预览很慢

loongembedded
博客专家认证
2012-04-20 06:16:20
加精
大家好,我的平台是WINCE6.0+S3C2451,摄像头是采用Q3S04C模组,其中的感光芯片是三星的S5K5CAGA,camera驱动采用的是基于DirectShow架构的,应用是用《windows CE嵌入式高级编程及其实例详解》第7章摄像头捕捉的例子,基于这个应用程序我们增加了不同的分辨率320*240,640*480,1024*768和2048*1536这四种分辨率来预览,对于三种分辨率,从选择预览到图像显示出来大概需要12s,而2048*1536相应的需要30s,在调试过程当中,我遇到下面的一些问题需要大家帮忙分析一下:

1.我在下面的应用程序中添加输出信息
if (!GetFirstCameraDriver( wzDeviceName ))
{
goto Cleanup;
}
NKDbgPrintfW(TEXT("PreviewCamera 222222\r\n"));
varCamName = wzDeviceName;
if(( varCamName.vt == VT_BSTR ) == NULL ) {
return FALSE;
}
//设置视频捕捉为第1个捕捉设备
PropBag.Write( L"VCapName", &varCamName );
CHK(m_pPropertyBag->Load( &PropBag, NULL ));
NKDbgPrintfW(TEXT("sundi 00000\r\n"));
可是为什么在NKDbgPrintfW(TEXT("PreviewCamera 222222\r\n"))和NKDbgPrintfW(TEXT("sundi 00000\r\n"));之间会调用了27次左右的CAM_IOControl()
CAM_IOControl qiang(d3076840): IOCTL:0x2f0003, InBuf:0x4f018, InBufLen:24, OutBuf:0x4f064, OutBufLen:0x4)
CAM_IOControl() minute=29,second=30
CAM_IOControl(d3076840): IOCTL_CS_PROPERTY
CAM_IOControl(d26a7f80): AdapterHandleCustomRequests
而不是一次呢?当后到预览图像出来之前还调用了很多次CAM_IOControl函数。

2.为什么对于2048*1536分辨率的预览,在下面的调用中消耗了大概13s的时间,而对于其他三种分辨率在这里大概消耗3s
CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_STILL, &MEDIATYPE_Video, m_pVideoCaptureFilter, NULL, m_pImageSinkFilter ));
而且我通过出口输出信息发现对于最高的分辨率来说,在这13s的时间里停留了4次,每次约为2.5s,而且是停在camera驱动输出的IOControl Adapter PDD: Unsupported PropertySet Request信息的地方,这种停顿对于前三种分辨率是没有的,应该是和高分辨率有关,因为高分辨率需要更大的内容,比如2048*1536*2=6MB,但具体不知道为什么会这样?如何解决这个问题?


备注:上面应用程序的源代码见链接:http://www.waterpub.com.cn/softdown/FileInfo-1.Asp?SoftID=2989

期望大家谈谈自己的想法、理解,期望能给我提供解决问题的思路,麻烦大家了,谢谢。

陈堪宜
...全文
9011 100 打赏 收藏 转发到动态 举报
写回复
用AI写文章
100 条回复
切换为时间正序
请发表友善的回复…
发表回复
loongembedded 2014-11-18
  • 打赏
  • 举报
回复
是啊,经过验证,内存扩大一倍后时间就缩短很多了
91program 2014-11-16
  • 打赏
  • 举报
回复
引用 47 楼 LoongEmbedded 的回复:
[quote=引用 46 楼 yiranyanghao 的回复:] 在预览时初始化寄存器要10s以上,每次预览都要重新初始化,用起来很不爽啊,应该怎么去修改?
现在我们又打算安排人员去解决这个问题,之前做过尝试,就是统一用显示屏的分辨率来预览,拍照的时候再用实际选择的分辨率,但对于2048*1536的分辨率,第一次拍照时间大概要10s,也就是说时间从预览这边转移到拍照这边来了。目前想知道要解决这个问题,是优化驱动还是优化应用?或是两边都需要?麻烦大家继续分享,谢谢。[/quote] 纯软件优化吗?这个还真有一定的难度。
loongembedded 2014-11-15
  • 打赏
  • 举报
回复
分享下,我们另一个平台IMX515+WINCE6.0内存为256M的,最高分辨率预览也慢,但升级为512MB后,就很快了,在3s之内
hongkonglife 2014-11-05
  • 打赏
  • 举报
回复
我的摄像头预览也很慢
  • 打赏
  • 举报
回复
学习了!!!!!!!!!!!!!
loongembedded 2013-09-02
  • 打赏
  • 举报
回复
不知道为什么最近看不到朋友的回帖
onlyhuiyi 2013-08-27
  • 打赏
  • 举报
回复
标记一下,正在做这些。。
loongembedded 2013-08-27
  • 打赏
  • 举报
回复
引用 80 楼 u011830708 的回复:

希望版主把这个家伙的ID给封了
loongembedded 2013-08-23
  • 打赏
  • 举报
回复
#73楼的兄弟,怎么广告做到这里来,请注意!
loongembedded 2013-08-22
  • 打赏
  • 举报
回复
引用 70 楼 u011781409 的回复:
这种方法非常可行效果感觉不错。
这位老兄验证了吗?
刘老五牌技 2013-08-22
  • 打赏
  • 举报
回复
这种方法非常可行效果感觉不错。
Jackson_GZ 2013-08-21
  • 打赏
  • 举报
回复
引用 55 楼 JTZP007 的回复:
[quote=引用 52 楼 51357 的回复:] 慢的原因: 从选择预览到图像显示出来需要的时间, 因为你使用了RenderStream()方法, 这个方法是一个Directshow智能连接的过程, 即是说, 添加一个camera filter了, 系统会逐一查找Filter进行连接, 包括查找注册表, 然后逐一创建filter, 再询问此filter支不支持此分辨率和颜色等格式参数, 这是一个反复的过程, 系统有很多的filter, 所以时间就可能会很久, 还取决于电脑安装了多少个filter, 不同的电脑所花的时间可能不一样, 甚至如果有些filter有bug可能会出错. 解决方法: 要减少加载时间, 你就不要使用RenderStream()方法, 先用Directshow工具GraphEdit, 找到会用到的filter. 然后在源代码中, 逐一用代码添加所需的filter,这样就不会有上面的智能连接过程, 就不存在等待的时间了.
但是低分辨率(320*240,640*480,1024*768)预览速度就会很快(2秒左右),高分辨率2048*1536预览速度慢了很多倍(12秒左右)。RenderStream()方法对高低分辨率处理有什么不一样?[/quote] 每个filter都有声明一个优先级, 智能连接, 会根据优先级询问支持这个分辨率, 低分辨率常用,多数filter支持,所以很容易找到了相应的了. 高分辨率支持得少, 所以查找过程先从高优先级查找,找不到又从低优先查找,所以过程可能会长. 应该掌握GraphEdit工具的用法, 手工添加capture filter, 然后render pin, 可以看到有一个等待过程, 如果你事先把要的filter添加进行GraphEdit里面,然后render时,这些filter会优先使用, 等待过程会几乎无. 当然可以手工连接这些pin, 等待时间更加少了. 写代码就是模拟在GraphiEdit中的操作, 但还是要熟悉directshow开发才行.
loongembedded 2013-08-21
  • 打赏
  • 举报
回复
奇怪,下午一些朋友的回帖我看不到
loongembedded 2013-08-21
  • 打赏
  • 举报
回复
引用 62 楼 51357 的回复:
[quote=引用 55 楼 JTZP007 的回复:] [quote=引用 52 楼 51357 的回复:] 慢的原因: 从选择预览到图像显示出来需要的时间, 因为你使用了RenderStream()方法, 这个方法是一个Directshow智能连接的过程, 即是说, 添加一个camera filter了, 系统会逐一查找Filter进行连接, 包括查找注册表, 然后逐一创建filter, 再询问此filter支不支持此分辨率和颜色等格式参数, 这是一个反复的过程, 系统有很多的filter, 所以时间就可能会很久, 还取决于电脑安装了多少个filter, 不同的电脑所花的时间可能不一样, 甚至如果有些filter有bug可能会出错. 解决方法: 要减少加载时间, 你就不要使用RenderStream()方法, 先用Directshow工具GraphEdit, 找到会用到的filter. 然后在源代码中, 逐一用代码添加所需的filter,这样就不会有上面的智能连接过程, 就不存在等待的时间了.
但是低分辨率(320*240,640*480,1024*768)预览速度就会很快(2秒左右),高分辨率2048*1536预览速度慢了很多倍(12秒左右)。RenderStream()方法对高低分辨率处理有什么不一样?[/quote] 每个filter都有声明一个优先级, 智能连接, 会根据优先级询问支持这个分辨率, 低分辨率常用,多数filter支持,所以很容易找到了相应的了. 高分辨率支持得少, 所以查找过程先从高优先级查找,找不到又从低优先查找,所以过程可能会长. 应该掌握GraphEdit工具的用法, 手工添加capture filter, 然后render pin, 可以看到有一个等待过程, 如果你事先把要的filter添加进行GraphEdit里面,然后render时,这些filter会优先使用, 等待过程会几乎无. 当然可以手工连接这些pin, 等待时间更加少了. 写代码就是模拟在GraphiEdit中的操作, 但还是要熟悉directshow开发才行. [/quote] 好的,非常感谢,我这边安排应用同事来熟悉directshow开发,老兄有哪些数据或是资料或是链接帮忙推荐一下。
sang321 2013-08-20
  • 打赏
  • 举报
回复
帮顶,好像很厉害的样子。。
loongembedded 2013-08-20
  • 打赏
  • 举报
回复
引用 52 楼 51357 的回复:
慢的原因: 从选择预览到图像显示出来需要的时间, 因为你使用了RenderStream()方法, 这个方法是一个Directshow智能连接的过程, 即是说, 添加一个camera filter了, 系统会逐一查找Filter进行连接, 包括查找注册表, 然后逐一创建filter, 再询问此filter支不支持此分辨率和颜色等格式参数, 这是一个反复的过程, 系统有很多的filter, 所以时间就可能会很久, 还取决于电脑安装了多少个filter, 不同的电脑所花的时间可能不一样, 甚至如果有些filter有bug可能会出错. 解决方法: 要减少加载时间, 你就不要使用RenderStream()方法, 先用Directshow工具GraphEdit, 找到会用到的filter. 然后在源代码中, 逐一用代码添加所需的filter,这样就不会有上面的智能连接过程, 就不存在等待的时间了.
非常感谢,很专业,我们的camera应用是基于应用是用《windows CE嵌入式高级编程及其实例详解》第7章摄像头捕捉的例子写的,由于对这块不熟悉,没有很好的办法优化,可否分享一下你提及“要减少加载时间, 你就不要使用RenderStream()方法, 先用Directshow工具GraphEdit, 找到会用到的filter. 然后在源代码中, 逐一用代码添加所需的filter,这样就不会有上面的智能连接过程, 就不存在等待的时间了”的源代码,我的QQ是597038165,不知是否能留下QQ,便于向你请教。
Jackson_GZ 2013-08-20
  • 打赏
  • 举报
回复
慢的原因: 从选择预览到图像显示出来需要的时间, 因为你使用了RenderStream()方法, 这个方法是一个Directshow智能连接的过程, 即是说, 添加一个camera filter了, 系统会逐一查找Filter进行连接, 包括查找注册表, 然后逐一创建filter, 再询问此filter支不支持此分辨率和颜色等格式参数, 这是一个反复的过程, 系统有很多的filter, 所以时间就可能会很久, 还取决于电脑安装了多少个filter, 不同的电脑所花的时间可能不一样, 甚至如果有些filter有bug可能会出错. 解决方法: 要减少加载时间, 你就不要使用RenderStream()方法, 先用Directshow工具GraphEdit, 找到会用到的filter. 然后在源代码中, 逐一用代码添加所需的filter,这样就不会有上面的智能连接过程, 就不存在等待的时间了.
hi瑞 2013-08-20
  • 打赏
  • 举报
回复
loongembedded 2013-08-20
  • 打赏
  • 举报
回复
引用 46 楼 yiranyanghao 的回复:
在预览时初始化寄存器要10s以上,每次预览都要重新初始化,用起来很不爽啊,应该怎么去修改?
现在我们又打算安排人员去解决这个问题,之前做过尝试,就是统一用显示屏的分辨率来预览,拍照的时候再用实际选择的分辨率,但对于2048*1536的分辨率,第一次拍照时间大概要10s,也就是说时间从预览这边转移到拍照这边来了。目前想知道要解决这个问题,是优化驱动还是优化应用?或是两边都需要?麻烦大家继续分享,谢谢。
loongembedded 2013-08-20
  • 打赏
  • 举报
回复
引用 59 楼 AAa_tnT 的回复:
哈,一年前的帖子,还没搞定?
是啊,我现在的事情又多又杂,你们应该是搞定了吧,可否分享一下要解决这个问题,驱动和应用都要修改吗?修改哪部分的?优化的思路是?
加载更多回复(49)

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧