公司网站建设精英,企业建设网站的主要作用,网站推广策略ppt,公司做网站有什么用引子#xff1a; 课题需要#xff0c;同时采集两个摄像头数据#xff0c;频率不高#xff0c;但要同时。中间遇到的问题#xff0c;唉一言难尽啊#xff01;
为了图省事使用UVC摄像头#xff0c;但是板子是USB1.1接口的#xff0c;故挑选兼容USB1.1的UVC驱动的摄像头 课题需要同时采集两个摄像头数据频率不高但要同时。中间遇到的问题唉一言难尽啊
为了图省事使用UVC摄像头但是板子是USB1.1接口的故挑选兼容USB1.1的UVC驱动的摄像头最终选定两个301V芯片的摄像头先使用一个摄像头因频率不高将采集频率设到了最低5帧每秒打开视频流正常视频缓冲出列入列正常保存图像正常再添加一个摄像头先使用VIDIOC_STREAMON打开一个摄像头正常再打开另一个报错了
出错代码
uvcvideo: Failed to submit URB 0 (-28).
经查疑似带宽不足
摘自http://answerpot.com/showthread.php?272129-Streamfrommultimplecameras
The uvcvideo driver requests bandwidth based on values reported by the camera. There are two settings involved there. The first one is the alternate settings for the video streaming interface. The video streaming interface has an isochronous endpoint for video streaming, and each alternate setting has a different maximum packet size for the endpoint, resulting in different bandwidth requirements. The second one is the dwMaxPayloadTransferSize value reported by the camera when querying its video streaming control. The driver selects the alternate setting with the lowest bandwidth that fulfills the dwMaxPayloadTransferSize requirements. If your camera has a single alternate setting (this can be checked using lsusb) youre probably screwed, as the bandwidth is fixed. If it has multiple alternate settings, it might be requesting a bandwidth higher than what it really needs. In that case you could try to hardcode a lower bandwidth (see the uvc_init_video function in uvc_video.c), or let the driver compute a bandwidth estimation on its own by setting the UVC_QUIRK_FIX_BANDWIDTH quirk. Its also possible to play with URB submission order to use higher bandwidths and alternate capture between the different webcams. Dennis Muhlestein investigated that and got interesting results. Search the list archives for a thread called Multiple camera framerate.
郁闷数日度日如年啊一头雾水未解唉菜鸟吗难道吃菜的鸟真的飞不高吗或许天生就不是搞代码的料。
后来的后来试了试另外的两个摄像头301PL的USB1.1接口Linux2.6.28中包含了该类型摄像头的驱动gspca据说是位法国学者编的同时打开两个摄像头意想不到的是报了3次错后打开了
zc3xx: probe 2wr ov vga 0x0000 zc3xx: probe 2wr ov vga 0x0000 gspca: usb_submit_urb [0] err -28 s3c2410-ohci s3c2410-ohci: leak ed ff1d2140 (#81) state 2 zc3xx: probe 2wr ov vga 0x0000 gspca: usb_submit_urb [0] err -28 s3c2410-ohci s3c2410-ohci: leak ed ff1d2180 (#81) state 2 zc3xx: probe 2wr ov vga 0x0000 gspca: usb_submit_urb [0] err -28 s3c2410-ohci s3c2410-ohci: leak ed ff1d21c0 (#81) state 2 zc3xx: probe 2wr ov vga 0x0000 this is vidCapture_thread of Left the 1 of Left state at:978442537 719669 this is vidCapture_thread of right the 1 of right state at:978442537 823039
不知为什么但是对比UVC和gspca驱动的源代码发现对于usb_submit_urb () 函数的返回值的处理是不同的gspca中加了对错误代码的判断将28号错误(ENOSPC)同其他的区别对待了
/* submit the URBs */ 614 for (n 0; n gspca_dev-nurbs; n) { 615 ret usb_submit_urb(gspca_dev-urb[n], GFP_KERNEL); 616 if (ret 0) { 617 PDEBUG(D_ERR|D_STREAM, 618 usb_submit_urb [%d] err %d, n, ret); 619 gspca_dev-streaming 0; 620 destroy_urbs(gspca_dev); 621 if (ret -ENOSPC) 622 break; /* try the previous alt */ 623 goto out; 624 } 625 }
而UVC中只要是提交没成功就退出。 菜鸟只能将问题提出来解决问题还要靠大侠们啊