(記錄android9以后調(diào)試所遇到的常見問題,有錯(cuò)請(qǐng)批評(píng)指正)
??????? UVC全稱為USB video(device) class,是微軟與另外幾家設(shè)備廠商聯(lián)合推出的為usb視頻捕獲設(shè)備定義的協(xié)議標(biāo)準(zhǔn);所以說UVC僅僅是usb規(guī)范協(xié)議中設(shè)備類規(guī)范的其中一種,是用作usb接口的視頻設(shè)備的一個(gè)統(tǒng)一的數(shù)據(jù)交換規(guī)范。
????????插入U(xiǎn)SB攝像頭會(huì)生成對(duì)應(yīng)的video節(jié)點(diǎn),使用如下指令,可以列舉出插入的usb設(shè)備:
rk3399:/ # grep -H '' /sys/class/video4linux/video*/name
grep -H '' /sys/class/video4linux/video*/name
/sys/class/video4linux/video0/name:rkisp1_mainpath
/sys/class/video4linux/video1/name:rkisp1_selfpath
/sys/class/video4linux/video10/name:YHX5M //第一個(gè)usb攝像頭
/sys/class/video4linux/video11/name:YHX5M
/sys/class/video4linux/video12/name:USB 2.0 PC Camera //第二個(gè)usb攝像頭
/sys/class/video4linux/video13/name:USB 2.0 PC Camera
.................
????????USB攝像頭支持的格式有這幾種:mjpg格式、yuv格式和h264;usb攝像頭能夠支持多種不同的分辨率,而且640x480是非常常見的分辨率;可以使用如下指令查詢USB攝像頭支持的格式,分辨率及幀率。USB camera的相機(jī)幀率一般是會(huì)根據(jù)光照自動(dòng)調(diào)節(jié)幀率的;你用手電筒照下,幀率應(yīng)該就會(huì)高了;如果你們需要固定幀率,需要USB camera的廠商控制;
v4l2-ctl -d /dev/videoX --list-formats-ext ? (videox 就是對(duì)應(yīng)的usb設(shè)備節(jié)點(diǎn))
????????新的SDK都有支持usb攝像頭的插拔,一般應(yīng)用在正常退出時(shí)會(huì)release攝像頭,如果沒有釋放,再去用相機(jī)app打開攝像頭時(shí),會(huì)導(dǎo)致攝像頭的video節(jié)點(diǎn)后移,出現(xiàn)打開異?,F(xiàn)象。
????????一般這種插拔問題,會(huì)出現(xiàn)在舊版本的,可能是預(yù)覽中間斷開,沒有執(zhí)行正常退出,沒有wakeup這個(gè)wait_event,所以一直休著;等待超時(shí)發(fā)現(xiàn)有冗余未釋放camera資源,及時(shí)通知釋放就好了。
常見攝像頭打不開問題
????????首先配置方面先確保如下幾點(diǎn),具體可以參考文檔 USB_UVC_Integrated_Cameras;
(1)以下設(shè)置是否都為true?
/device/rockchip/rk3xxx/BoardConfig.mk
BOARD_CAMERA_SUPPORT := true
BOARD_CAMERA_SUPPORT_EXT := true
(2)cat /vendor/etc/vintf/manifest.xml | grep external //確定是否有external信息
如果沒有,則進(jìn)行添加 /device/rockchip/rk3399/manifest.xml
<interface>
<name>ICameraProvider</name>
<instance>legacy/0</instance>
<instance>external/0</instance> //有該配置項(xiàng)嗎?
</interface>
(3) 其它型號(hào)的usb攝像頭是否也打不開? 也有可能是攝像頭的問題,所以試試usb camera 插電腦(PC)上,看是否能正常預(yù)覽出圖;可以下載一個(gè)usbcamera的apk去看看:adb install usbcamera的apk
????????其次,dumpsys media.camera看下是否注冊(cè)上攝像頭;若注冊(cè)上了,攝像頭還打不開,則需要具體logcat進(jìn)行分析;
將下面三個(gè)文件的LOG_NDEBUG宏定義注釋去掉
hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 0
????????然后在hardware/interfaces/camera/device/3.4/default$ mm -j12 ;編譯生成:camera.device@3.4-external-impl.so 在 vendor/lib目錄下,所以修改庫(kù)后,直接編譯替換這個(gè)庫(kù)即可!然后執(zhí)行指令抓logcat
logcat -c && pkill camera* && pkill provider* && logcat
打開相機(jī)抓份logcat
????????一般打不開時(shí),很大概率是external_camera_config.xml 文件中沒有添加usb camera的相關(guān)分辨率以及幀率;在xml中也可以修改旋轉(zhuǎn)角度以及jpeg buffer。USB分辨率,例如預(yù)覽想要3840x2160,拍照也想要3840x2160,那么需要在xml文件中將MaxJpegBufferSize改大一點(diǎn),默認(rèn)是3MB(1MB=1024KB,1KB=1024B, 1B=8bit),可以修改成4MB,5MB.
<Orientation degree="90"/>
<MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
ps:3MB = 3*1024 KB = 3*1024*1024 B = 3145728 B
????????查看內(nèi)核log:表示usb設(shè)備已經(jīng)識(shí)別到了;可以找到相關(guān)的video節(jié)點(diǎn),用v4l2工具取流,看是否正常;
[ 194.108702] usb 1-1.3: new high-speed USB device number 5 using ehci-platform
[ 194.304772] usb 1-1.3: New USB device found, idVendor=046d, idProduct=082b, bcdDevice=28.25
[ 194.304899] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 194.304924] usb 1-1.3: Product: Webcam C170
[ 194.304946] usb 1-1.3: Manufacturer:
v4l2-ctl --verbose -d /dev/videox --set-fmt-video=width=640,height=480,pixelformat='MJPG' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=640,height=480
前后攝設(shè)置
????????默認(rèn)是后攝,前攝如下修改
hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
const uint8_t facing = ANDROID_LENS_FACING_FRONT; //BACK
UPDATE(ANDROID_LENS_FACING, &facing, 1);
前后攝切換
1.android9,android10如下修改
/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -309,7 +309,15 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(
UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
&opticalStabilizationMode, 1);
- const uint8_t facing = ANDROID_LENS_FACING_BACK;
+ const char* dev = mCameraId.c_str();
+ int index = (int) (*(dev + (strlen(dev) - 1)) - '0');
+ ALOGE("dev:%s index:%d", dev, index);
+ const uint8_t facing = (index / 2) % 2 ? ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
UPDATE(ANDROID_LENS_FACING, &facing, 1);
2.android11及12如下修改
/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -309,7 +309,15 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(
UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
&opticalStabilizationMode, 1);
- const uint8_t facing = ANDROID_LENS_FACING_BACK;
+ const char* dev = mCameraId.c_str();
+ int index = atoi(dev);
+ ALOGE("dev:%s index:%d", dev, index);
+ const uint8_t facing = (index / 2) % 2 ? ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
UPDATE(ANDROID_LENS_FACING, &facing, 1);
錄像問題
????????錄像分辨率及幀率在/device/rocchip/下的media_profiles_defaults.xml 里配置,編譯時(shí)會(huì)拷到 /vendor/etc/media_profiles_V1_0.xml
????????xml中通過id來識(shí)別攝像頭即,根據(jù)實(shí)際情況可以添加或刪除分辨率
## 錄像問題
? 錄像分辨率及幀率在/device/rocchip/下的media_profiles_defaults.xml
里配置,編譯時(shí)會(huì)拷到 /vendor/etc/media_profiles_V1_0.xml
? xml中通過id來識(shí)別攝像頭即,根據(jù)實(shí)際情況可以添加或刪除分辨率
<CamcorderProfiles cameraId="0">
<CamcorderProfiles cameraId="1">
..........
<EncoderProfile quality="480p" fileFormat="mp4" duration="30">
<Video codec="h264"
bitRate="3000000" //錄像模糊時(shí),可以增大bitRate
width="640"
height="480"
frameRate="25" />
..........
</EncoderProfile>
????????例如usb攝像頭是480p的,但是你錄像時(shí)默認(rèn)打開的分辨率為1080p,因此切換到錄像時(shí),會(huì)出現(xiàn)Can't connect to the camera報(bào)錯(cuò),此時(shí)可以在xml中將對(duì)應(yīng)sensor模塊的1080p分辨率去除。
?????????USB攝像頭拍照是正常的,但是錄像的時(shí)候會(huì)提示報(bào)錯(cuò);這種有可能是幀率不對(duì),不支持導(dǎo)致的,具體可以看logcat。例如:device/rockchip里的media_profiles_default.xml 里framerate 改成25就解決了(dumpsys media.camera 里 可以看到支持幀率有25 但是沒30幀)
鏡像問題
Hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp ? Hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
可以試下ExternalCameraDevice.cpp里 facing 改為BACK 后,看下預(yù)覽是否會(huì)鏡像了;
預(yù)覽、拍照、錄像這三種情況都會(huì)有鏡像相關(guān)的問題(有相關(guān)patch)
1)預(yù)覽鏡像問題,在代碼中修改成前置或后置就可以解決;
2)拍照鏡像問題,libyuv::I420Scale 和 libyuv::I420MIrror 這段代碼才是控制拍照鏡像和翻轉(zhuǎn)的
3)錄像鏡像問題:這是控制錄像視頻的mirror,即把 rga_nv12_scale_crop 里的 false 改成 (halBuf.usage & BufferUsage::VIDEO_ENCODER)
拉伸問題
????????USB攝像頭預(yù)覽變形,換其他型號(hào)的USB攝像頭也一樣;看log picturesize:1920x1080,previewBuffer:1920x1080 預(yù)覽分辨率為1080P,整體屏幕也是1080P,為什么會(huì)拉伸收縮變形?
需要注意的是攝像頭成像長(zhǎng)邊要跟顯示屏長(zhǎng)邊平行擺放;
默認(rèn)豎屏設(shè)備 前攝 orientation 要為270,后攝為90;
默認(rèn)橫屏設(shè)備 前后攝 orientation都為0;
因此在xml中修改下orientation即可。
video節(jié)點(diǎn)權(quán)限問題
抓取logat后,關(guān)鍵字查詢 E/CAM 發(fā)現(xiàn)沒有權(quán)限
06-21 18:19:17.164 E/CamPvdr@2.4-external( 256): deviceAdded open v4l2 device /dev/video12 failed:Permission denied
06-21 18:19:17.165 E/CamPvdr@2.4-external( 256): deviceAdded open v4l2 device /dev/video13 failed:Permission denied
ls -l /dev/video* 查看下權(quán)限
crw-rw---- 1 media camera 81, 10 2022-06-22 09:47 /dev/video10
crw-rw---- 1 media camera 81, 11 2022-06-22 09:47 /dev/video11
crw------- 1 root root 81, 16 2022-06-22 09:47 /dev/video12
crw------- 1 root root 81, 17 2022-06-22 09:47 /dev/video13
如下修改后即可
/device/rockchip/common/ueventd.rockchip.rc
#for external camera
/dev/video10 0660 media camera
/dev/video11 0660 media camera
+ /dev/video12 0660 media camera
+ /dev/video13 0660 media camera
dqbuf卡住問題
????????主要是針對(duì)usb攝像頭插拔導(dǎo)致的一系列問題,例如插拔usb攝像頭時(shí),導(dǎo)致camera服務(wù)卡死,畫面卡著不動(dòng);正常情況下插拔攝像頭后預(yù)覽畫面可以恢復(fù)的。這種可能是預(yù)覽中間斷開,沒有執(zhí)行正常退出,沒有wakeup這個(gè)wait_event,所以一直休著;等待超時(shí)發(fā)現(xiàn)有冗余未釋放camera資源,應(yīng)及時(shí)通知釋放。(3588更新代碼,會(huì)有這個(gè)補(bǔ)丁的)
????????此外還有可能要加上0001-DQBUF-add-select.patch,一般拔掉usb攝像頭后,apk會(huì)彈窗報(bào)錯(cuò)自動(dòng)退出;如果沒有彈框報(bào)錯(cuò),說明dqbuf還是被卡住了,線程得不到釋放,導(dǎo)致apk出現(xiàn)anr;要檢查下補(bǔ)丁是否有打進(jìn)去,是否生效了。 ?
????????后面有空介紹這些:文章來源:http://www.zghlxwxcb.cn/news/detail-419444.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-419444.html
到了這里,關(guān)于RK平臺(tái)USB攝像頭FAQ的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!