Android支持USB攝像頭

         關於Android支持USB攝像頭的帖子網上是有一些的,雖然內容都是轉載過來的,前一段時間因爲工作需要,必須實現在Android上實現USB攝像頭和主攝像頭同時錄像,便自己動手嘗試實現了一下,最終實現的效果是兩個攝像頭同時預覽,最近還是看到一些人提問實現USB攝像頭的問題,所以在這說說是如何實現的,部分內容摘自http://blog.csdn.net/sukhoi27smk/article/details/18269097,希望能對自己和他人有所幫助。

         討論的前提是你的USB攝像頭是UVC兼容的(如今大部分攝像頭兼容)
         默認Android不提供訪問外部攝像頭的API,所以你要考慮寫一個內核到Android應用層通信的中間件。
         當你給設備接入了USB攝像頭,首先要檢查一下幾點:
        1)你的設備是否支持USB-OTG?
        2)是否在/dev目錄創建了設備?如果創建了就那麼一切就很簡單了。shell 執行 ls -l /dev/v*,你將會看到video0或者video1。
        3)如果/dev沒有創建設備,你需要寫一個固件(UVC)跟硬件通信!

一條一條的解釋上面的內容,想要實現USB攝像頭,需要攝像頭UVC兼容,其實這是因爲Linux驅動中有包含UVC的驅動,對於那些有Android源代碼的可以在Linux目錄下敲入命令

make ARCH=arm menuconfig

依次展開

Device Drivers  --->

           <*> Multimedia support  --->

                         [*]   Video capture adapters  --->
                                          [*]   V4L USB devices  --->

可以看到UVC攝像頭的驅動就是在這裏添加的,當然如果你已知USB攝像頭的型號可以選擇這個選項裏有的對應的驅動

所以有源代碼的必須保證在這裏Linux是有對UVC攝像頭進行支持的,這是第一步,如果無法看到我所說的這些選項,有可能是其餘某些依賴沒有打開,還有就是不一定打開了上述選項USB攝像頭一定會被識別,某些平臺可能會有自己的一套框架,同樣需要被選定,這些都要根據具體情況來進行分析。

        接下來就是OTG功能了,其實準確的說就是需要在USB攝像頭插入的時候Android USB能充當主機,我們都知道USB設備在傳輸的時候也是有主機和從機之分的,比如說電腦上的USB基本上我們會用來當HOST,U盤總是SLAVE,目前來說我用過的Android手機都是支持OTG的,當然有代碼的也可以menuconfig檢查一下,也可以拿一個U盤測試以下OTG是否工作,如果都沒問題那麼可以測試一下第二條:是否在/dev目錄創建了設備?如果創建了就那麼一切就很簡單了。shell 執行 ls -l /dev/v*,你將會看到video0或者video1。準確的說是video1或者video0會隨着你插拔USB攝像頭而出現消失,如果無法出現該現象而OTG確實能正常工作,那麼需要寫一個攝像頭驅動,這個過程會很困難,可以準備尋求驅動工程師支持或者檢查是不是別的原因導致的。

       好了,如果以上都不存在問題,那就意味着Linux已經可以操作USB攝像頭了,如果在Linux上開發就可以直接寫APP了,但是我們現在Android上,Android不提供USB攝像頭API,我們需要自己去實現,這裏有一份代碼,是國外的一個網站的,也是從參考博客中找到的這個地址https://bitbucket.org/neuralassembly/simplewebcam/src,我們想用這份代碼需要我們的需求適當修改一些內容,導入工程到eclips打開jni下面的Image_Proc.c可以看到如下部分。

	// /dev/videox (x=cameraId+cameraBase) is used.
	// In some omap devices, system uses /dev/video[0-3],
	// so users must use /dev/video[4-].
	// In such a case, try cameraId=0 and cameraBase=4
	private int cameraId=0;
	private int cameraBase=0;
	
	// This definition also exists in ImageProc.h.
	// Webcam must support the resolution 640x480 with YUYV format. 
	static final int IMG_WIDTH=640;
	static final int IMG_HEIGHT=480;
       首先是cameraId,我們之前嘗試了插拔USB攝像頭會有一個video0或者video1出現或者消失,而這個cameraId的值應該是0對應video0,1對應video1,以此類推,之後是IMG_WIDTH和IMG_HEIGHT,首先我們要確定我們這個USB攝像頭支持那一些格式,如果不確定那就嘗試幾次,比如說上面指的是VGA640*480分辨率,有些720p的USB攝像頭就需要改變一下這個參數,應該是1280*720,同樣定義在ImageProc.h中的定義也要改,上面註釋有寫,這個我沒有去測試過,修改完成之後編譯運行,看看USB攝像頭是不是出現圖像了?我本人當時是已經出現圖像了的,但是看參考博客上說需要修改video0或者video1的權限,因爲我這邊默認的權限就是666所以不需要修改,如果不是的話就改一下,命令是chmod 666 /dev/videoX,好了應該是大功告成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章