Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
How to use multi-camera API in Android
Kurun
January 17, 2020
Programming
0
480
How to use multi-camera API in Android
Kurun
January 17, 2020
Tweet
Share
More Decks by Kurun
See All by Kurun
kurunpan
1
1.1k
kurunpan
0
470
kurunpan
1
1.1k
kurunpan
4
1.1k
kurunpan
2
1.2k
kurunpan
4
510
kurunpan
3
500
kurunpan
4
1.1k
Other Decks in Programming
See All in Programming
manfredsteyer
PRO
0
250
showwin
0
120
nauleyco
0
200
rishitdagli
0
170
sullis
0
120
e10dokup
0
440
akatsukinewgrad
0
150
chichou
1
820
line_developers_tw2
0
620
dulltz
0
410
momofff
0
160
canon1ky
3
340
Featured
See All Featured
shpigford
165
19k
dotmariusz
94
5.1k
lara
590
61k
bkeepers
321
53k
chriscoyier
780
240k
malarkey
192
8.5k
jnunemaker
PRO
40
4.5k
erikaheidi
13
4.2k
frogandcode
127
20k
lemiorhan
626
42k
samanthasiow
56
6.3k
marcelosomers
220
15k
Transcript
How to use multi-camera API in Android shibuya.apk #38 -
report from KotlinConf 2019 (2020/01/17) @kurun_pan
Self-introduction @kurun_pan @Kurun-pan Software Engineer @Sony Linux / Android /εϓϥτΡʔϯΛѪ͢ΔΤϯδχΞ
Kurun / ͘ΔΜ
Support multi-camera API from Android 9 https://source.android.com/devices/camera/multi-camera
Multi-camera use case • Ұ൪ଟ͍ϢʔεέʔεɺϢʔβͷζʔϜૢ࡞ʹ࿈ಈͨ͠ΧϝϥϨϯζʢྫ͑ɺ֯/ԕϨ ϯζ㱻ඪ४ϨϯζʣͷΓସ͑ • ͦͷଞɺεςϨΦΧϝϥͰDepth (Ԟߦ͖) ࢉग़Ͱ͖ͨΓ
֯Χϝϥ ඪ४Χϝϥ
Logical and physical camera from Android 9 • CameraManagerܦ༝ͰऔಘՄೳͳΧϝϥ(ID)ʹlogical cameraͱphysical
cameraͷ2छྨ͕ଘࡏ • ྫ͑ɺlogical-cameraΛར༻ͯ͠ɺಉ࣌ʹෳΧϝϥͷετϦʔϜऔಘͳͲ͕Մೳ ʙ"OESPJE "OESPJEʙ %FWJDFWFOEPST "QQ%FWFMPQFST ͋͘·Ͱઆ໌༻ͷΠϝʔδߏͰ͢ MPHJDBMDBNFSB #BDLDBNFSB #BDLDBNFSB #BDLDBNFSB MPHJDBMDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB #BDLDBNFSB #BDLDBNFSB #BDLDBNFSB MPHJDBMDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB %FWJDFWFOEPST "QQ%FWFMPQFST MPHJDBMDBNFSB #BDLDBNFSB #BDLDBNFSB $BNFSB*% $BNFSB*% QIZTJDBMDBNFSB MPHJDBMDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB $BNFSB*% $BNFSB*% $BNFSB*% $BNFSB*% $BNFSB*% $BNFSB*%
Multi-camera API (Camera2) Ͱ ෳΧϝϥͷಉ੍࣌ޚ͢Δํ๏ʹ͍ͭͯ
Step 1. Get camera IDs CameraManager#getCameraIdListͰcamera idͷҰཡΛऔಘ ͨͩ͠ɺlogical-cameraʹଐ͢Δphysical-cameraͷIDؚ·Εͳ͍ val manager:
CameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager for (cameraId in manager.cameraIdList) { … } #BDLDBNFSB #BDLDBNFSB #BDLDBNFSB MPHJDBMDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB %FWJDFWFOEPST "QQ%FWFMPQFST MPHJDBMDBNFSB #BDLDBNFSB #BDLDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB 'SPOUDBNFSB $BNFSB*% $BNFSB*% $BNFSB*% $BNFSB*% $BNFSB*% $BNFSB*% ӈਤͷ߹ɺDBNFSB*E-JTU ͷΈ ˞௨ৗɺ*%͕σϑΥϧτͷഎ໘Χϝϥɺ *%͕લ໘Χϝϥ
Step 2. Check multi-camera is supported or not for (cameraId
in manager.cameraIdList) { val characteristics = manager.getCameraCharacteristics(cameraId) // get supported capabilities val capabilities = characteristics.get( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES ) // logical-camera or not? val isLogicalCamera = capabilities!!.contains( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA ) if (isLogicalCamera) { val physicalCameraIds = characteristics.physicalCameraIds … } … } CameraManager#getCameraCharacteristicsͰlogical cameraͷαϙʔτ༗ແνΣοΫ ✓ REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAͷνΣοΫ ✓ CameraCharacteristics#getPhysicalCameraIdsͰphysical camera idΛऔಘ #BDLDBNFSB #BDLDBNFSB #BDLDBNFSB %FWJDFWFOEPST "QQ%FWFMPQFST MPHJDBMDBNFSB #BDLDBNFSB #BDLDBNFSB $BNFSB*% $BNFSB*% $BNFSB*% ӈਤͷ߹ɺ QIZTJDBM$BNFSB*ET
Step 3. Open logical camera CameraManager#openCameraͰɺΧϝϥIDʹରͷlogical camera idΛࢦఆ ※جຊతͳCamera2ͰͷΓํͱಉ͘͡ɺstateCallbackͰCameraDeviceΛऔಘ cameraManager.openCamera(logicalCameraId,
stateCallback, backgroundHander) #BDLDBNFSB #BDLDBNFSB #BDLDBNFSB %FWJDFWFOEPST "QQ%FWFMPQFST MPHJDBMDBNFSB #BDLDBNFSB #BDLDBNFSB $BNFSB*% $BNFSB*% $BNFSB*%
Step 4. Create CaptureSession CaptureSessionͷ࡞ɹ※SessionConfigurationMulti-camera APIͱͯ͠API 28͔ΒՃ ✓ CameraDevice#createCaptureSessionͷҾSessionConfigurationʹରͷphysical camera
id/TextureViewΛࢦఆ ✓ ͦͷޙCamera2ͷ͓࡞๏ͱಉ༷ ✓ (ੜͨ͠CaptureSessionʹରͯ͠CaptureSession#setRepeatingRequestΛ࣮ߦͯ͠Ωϟϓνϟ։࢝) private fun createDualCamera(surfaces: List<Surface>) { val outputConfigs = surfaces.mapIndexed { index, surface -> val config = OutputConfiguration(surface) val physicalCameraId = physicalCameraIds.toList()[index] config.setPhysicalCameraId(physicalCameraId) config ^mapIndexed } val executor = Executors.newCachedThreadPool() val sessionConfig = SessionConfiguration( SessionConfiguration.SESSION_REGULAR, outputConfigs, executor, captureStateCallback ) cameraDevice?.createCaptureSession(sessionConfig) } #BDLDBNFSB #BDLDBNFSB #BDLDBNFSB %FWJDFWFOEPST "QQ%FWFMPQFST MPHJDBMDBNFSB #BDLDBNFSB #BDLDBNFSB $BNFSB*% $BNFSB*% $BNFSB*%
ͬͯΈͨײ (·ͱΊ)
Points I noticed after using multi-camera API • ͍͔ͭ͘ͷAndroid 10ػछͰࢼͯ͠Έ͕ͨɺlogical-cameraඇαϙʔτػछ͕ଟͦ͏ͳؾ
✓ Pixel 3αϙʔτ ✓ Galaxy S10 Plusඇαϙʔτ ✓ physical-cameraશΧϝϥͷIDΛऔಘͰ͖ͳ͔ͬͨ • logical-cameraͷΈΛࢦఆͯ͠ར༻ͨ͠߹ͷڍಈ͕ෆ໌ ✓ Pixel3ͷ߹ɺ෦తʹҰͭͷݻఆphysical-cameraΛར༻͍ͯ͠Δ༷ࢠ ➡ ζʔϜʹԠͯ֯͡Ϩϯζͱඪ४ϨϯζͷΓସ͑ͳͲҰͳ͠ ➡ CaptureRequestͰઃఆՄೳͳԿ͔ͷઃఆʹ࿈ಈ͍ͯ͠Δʁ • logical-cameraʹؚ·ΕΔphysical-camera୯ҰͰͷར༻͕Մೳͩͬͨ
Camera Architecture in Android $BNFSB)BSEXBSF -JOVY,FSOFM $BNFSB%FWJDF%SJWFS $BNFSB)"- "OESPJE'SBNFXPSL $BNFSB$BNFSB9
"QQMJDBUJPO εϚʔτϑΥϯ 4P$ ϕϯμʔʹґଘ "OESPJE04WFSTJPO "1*-FWFM ʹґଘ ࠓ࣌Ͱ$BNFSB9.VMUJDBNFSB"1*ඇαϙʔτ ҰൠతʹϋʔυΣΞܥ(Bluetooth BLEͳͲ)ͷػೳػछʹڧ͘ґଘͯ͠͠·͏ͨΊɺ ΞϓϦͰͷϚϧνΧϝϥػೳαϙʔτ͕͍͠
Thank you!☺