現在要實作一個USB Cam功能,將攝像頭采集到的實時影像資料,經過jpeg編碼后,通過usb otg傳輸到PC端
現在模仿webcam (drivers/usb/gadget/webcam.c )
在 Android usb (drivers/usb/gadget/Android.c)上 實作了一個UVC Camera驅動(添加到usb composite設備陣列里)
USB連上PC后,在PC端可以被識別為uvc camera設備。
USB視頻輸出的應用程式,主要參照
http://git.ideasonboard.org/uvc-gadget.git/commit/9fbc003442056cdf59b87e94c1d0e3814575d4b3
并做了一些修改
【實作思路】
傳輸資料的基本流程是這樣的
開始資料傳輸時
1.向驅動申請了4個幀緩沖(VIDIOC_REQBUFS)
2.獲取幀緩沖資訊(VIDIOC_QUERYBUF),并將申請到的幀緩沖映射到用戶空間
3.填充4幀資料后,將4個幀緩沖入驅動佇列(VIDIOC_QBUF)
4.select監聽并等待設備檔案的“可寫”狀態
5.設備檔案“可寫”時,出佇列取得一幀緩沖(VIDIOC_DQBUF)
6.向幀緩沖填充一幀資料
7.將幀緩沖重新入佇列(VIDIOC_QBUF)
重復 5 - 7步 實作連續的資料傳輸
目前已經可以實作,將攝像頭實時采集的連續影像資料,經過USB在PC端顯示出來。(MJPEG)
PC端使用軟體是AMCap
【目前問題】
現在當每幀的資料量保持在500多KB以上時,視頻可以連續傳輸,這沒有問題。
但是如果每幀資料量低于500多KB時,可能傳輸了十幾幀,幾十幀后,就停止了。
跟蹤代碼后,發現是在 select這邊超時了。既select不回傳“可寫”狀態
這個問題查了很久,一直不明白是哪里的原因。
新手剛接觸USB這塊,煩請各位高手們賜教!~
uj5u.com熱心網友回復:
select超時,獲取錯誤碼試試?uj5u.com熱心網友回復:
select超時,errno 是22 (Invalid argument)
uj5u.com熱心網友回復:
usb使用的是 同步傳輸 模式,出現select 超時現象時,內核輸出log “There are no more ISOC requests”uj5u.com熱心網友回復:
LZ ,請問你用的是什么板子,我也在做這個uj5u.com熱心網友回復:
1.你的攝像頭的幀數可能不是固定了,一般USB攝像頭幀數與光照有關。2.超時時間可以自己設定修改,在select中
3.引起你超時的原因可能是硬體上的原因,如供電能力不足(純屬猜測)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/77669.html
標籤:驅動程序開發區
下一篇:哪位大神能提供幫助
