日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux: 两个USB摄像头的数据采集问题

發布時間:2023/12/10 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux: 两个USB摄像头的数据采集问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引子: 課題需要,同時采集兩個攝像頭數據,頻率不高,但要同時。中間遇到的問題,唉一言難盡啊!

為了圖省事使用UVC攝像頭,但是板子是USB1.1接口的,故挑選兼容USB1.1的UVC驅動的攝像頭,最終選定兩個301V芯片的攝像頭,先使用一個攝像頭,因頻率不高,將采集頻率設到了最低5幀每秒,打開視頻流,正常!視頻緩沖出列,入列,正常!保存圖像,正常!再添加一個攝像頭,先使用VIDIOC_STREAMON打開一個攝像頭,正常,再打開另一個,報錯了!

出錯代碼:

uvcvideo: Failed to submit URB 0 (-28).

經查疑似帶寬不足,

(摘自http://answerpot.com/showthread.php?272129-Stream+from+multimple+cameras)

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) you're 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.

It's 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中只要是提交沒成功就退出。

?

菜鳥只能將問題提出來,解決問題還要靠大俠們啊

?

?

?

總結

以上是生活随笔為你收集整理的Linux: 两个USB摄像头的数据采集问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。