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
550
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.2k
kurunpan
0
530
kurunpan
1
1.2k
kurunpan
4
1.1k
kurunpan
2
1.3k
kurunpan
4
540
kurunpan
3
540
kurunpan
4
1.2k
Other Decks in Programming
See All in Programming
imk2o
0
210
77web
2
2.5k
hyodol2513
2
1.1k
kodetr
0
160
kubode
2
190
uhyo
19
9.2k
bkuhlmann
6
710
etagwerker
1
140
manfredsteyer
PRO
2
260
chimerast
0
350
matyo91
1
150
ykpythemind
0
150
Featured
See All Featured
aarron
258
36k
garrettdimon
289
110k
paulrobertlloyd
71
3.7k
keithpitt
402
20k
jcasabona
8
590
keathley
20
770
destraynor
221
47k
zenorocha
296
40k
trallard
15
830
deanohume
294
28k
geeforr
333
29k
kneath
294
39k
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!☺