카메라 제어
이 가이드에서는 PlanetKit의 카메라 동작 및 관리 방법을 설명합니다.
- 비디오 전송, 미리보기 상태, 통화 상태에 따라 PlanetKit이 내부적으로 카메라 켜짐/꺼짐을 결정하는 방식
- 애플리케이션에서 제어할 수 있는 카메라 기능
| 지원 통화 유형 | 최소 SDK 버전 |
|---|---|
| 1대1 통화, 그룹 통화(컨퍼런스) | PlanetKit 5.5 |
카메라 켜짐/꺼짐 동작
PlanetKit은 다음 조건 중 하나 이상이 충족되면 카메라를 켭니다.
- 원격 피어에게 비디오가 전송 중인 경우
- 하나 이상의 카메라 미리보기가 활성화된 경우
카메라는 두 조건 모두 충족되지 않을 때만 꺼집니다.
| 조건: 하나 이상의 미리보기가 활성화됨 | 조건: 비디오가 전송 중임 | 결과: 카메라 장치 상태 |
|---|---|---|
| 아니오 | 아니오 | 꺼짐 |
| 예 | 아니오 | 켜짐 |
| 아니오 | 예 | 켜짐 |
| 예 | 예 | 켜짐 |
다음 기능도 카메라 상태에 영향을 줍니다.
- 초기 비디오 상태
- 초기 비디오 전송 상태는
makeCall(),acceptCall(),joinConference(), 또는enableVideo()에 전달되는initialMyVideoState속성/파라미터 값으로 제어합니다.PlanetKitInitialMyVideoState.RESUME(기본값): 비디오가 활성 상태로 시작되며, 통화 시작 시 카메라가 켜집니다.PlanetKitInitialMyVideoState.PAUSE: 비디오가 일시 정지 상태로 시작되며,resumeMyVideo()가 호출될 때까지 카메라가 꺼진 상태를 유지합니다.
- 초기 비디오 상태 설정에 관한 자세한 내용은 초기 비디오 상태를 참조하세요.
- 초기 비디오 전송 상태는
- 통화 일시 중지/재개
hold()를 호출하면 카메라가 꺼지고 비디오 전송이 비활성화됩니다.unhold()를 호출하면 카메라가 다시 켜지고 비디오 전송이 활성화됩니다.- 통화 일시 중지/재개에 관한 자세한 내용은 통화 일시 중지를 참조하세요.
- 비디오 일시 정지/재개
pauseMyVideo()를 호출하면 카메라가 꺼지고 비디오 전송이 비활성화됩니다.resumeMyVideo()를 호출하면 카메라가 다시 켜지고 비디오 전송이 활성화됩니다.
1대1 영상 통화에서 수신자가 통화가 완전히 연결되기 전에 응답자 준비 상태에 진입하면, PlanetKit은 비디오가 네트워크에 전송되기 전에 카메라를 켤 수 있습니다. 이 단계에서도 pauseMyVideo()와 resumeMyVideo()는 카메라를 정상적으로 끄거나 켜지만, 실제 비디오 전송은 준비가 완료된 후에만 시작됩니다.
카메라 제어 기능
PlanetKitCameraManager는 카메라 장치 전환, 캡처 해상도 설정, 미리보기 시작 및 중지, 카메라 관련 이벤트 처리를 위한 카메라 관리 API를 제공합니다.
카메라 장치 유형
PlanetKit은 다음 카메라 유형을 지원합니다.
| 유형 | 설명 |
|---|---|
FRONT | 전면 카메라 |
BACK | 후면 카메라 |
EXTERNAL | USB 외부 카메라(장치 지원 여부에 따라 다름) |
카메라 전환
활성 카메라를 전환하려면 PlanetKitCameraManager에서 cameraType을 설정하세요.
val cameraManager = PlanetKit.getCameraManager()
// Switch to back camera
cameraManager.cameraType = PlanetKitCameraType.BACK
// Switch to front camera
cameraManager.cameraType = PlanetKitCameraType.FRONT
카메라 유형이 변경될 때 알림을 받으려면 CameraTypeChangedListener를 등록하세요.
val cameraTypeChangedListener = PlanetKitCameraManager.CameraTypeChangedListener { cameraType ->
Log.d(TAG, "Camera type changed to: $cameraType")
}
cameraManager.addCameraTypeChangedListener(cameraTypeChangedListener)
// Unregister when no longer needed
cameraManager.removeCameraTypeChangedListener(cameraTypeChangedListener)
캡처 해상도 설정
특정 캡처 해상도를 설정하려면 setManualResolution()을 호출하세요. 장치 최적 기본값으로 되돌리려면 setDefaultResolution()을 호출하세요.
// Set resolution to VGA
cameraManager.setManualResolution(PlanetKitCameraResolution.VGA)
// Restore device-optimal default resolution
cameraManager.setDefaultResolution()
사용 가능한 PlanetKitCameraResolution 값은 다음과 같습니다.
| 값 | 크기 |
|---|---|
QVGA | 320×240 |
VGA | 640×480 |
HD | 1280×960 |
해상도를 지정하지 않으면 PlanetKit은 장치의 최적 기본값을 사용합니다.
카메라 미리보기
PlanetKitVideoView와 함께 startPreview() 및 stopPreview()를 사용하여 통화와 독립적으로 카메라 미리보기를 시작하고 중지할 수 있습니다.
// Start preview
cameraManager.startPreview(videoView)
// Stop preview
cameraManager.stopPreview(videoView)
카메라 상태 이벤트 처리
카메라 시작, 중지, 오류 이벤트를 수신하려면 StateListener를 등록하세요.
val stateListener = object : PlanetKitCameraManager.StateListener {
override fun onStart() {
Log.d(TAG, "Camera started")
}
override fun onStop() {
Log.d(TAG, "Camera stopped")
}
override fun onError(@PlanetKitCameraManager.StateListener.ErrorCode code: Int) {
when (code) {
PlanetKitCameraManager.StateListener.ERROR_CODE_EVICT -> {
// Camera was taken over by another app
Log.w(TAG, "Camera evicted by another app")
}
PlanetKitCameraManager.StateListener.ERROR_CODE_OPEN_FAIL -> {
// Camera failed to open
Log.e(TAG, "Camera failed to open")
}
}
}
}
cameraManager.setStateListener(stateListener)
카메라 열기에 실패하면 PlanetKit은 onError()를 통해 오류를 보고하지만 통화 연결은 유지합니다. 카메라가 다시 사용 가능해질 때까지 비디오 캡처가 중지됩니다.
USB 카메라(외부 카메라) 가용성 처리
외부 카메라 가용성과 관련된 이벤트를 수신하려면 UsbCameraAvailabilityListener를 등록하세요. 이벤트를 사용하기 전에 장치가 외부 카메라를 지원하는지 확인하세요.
if (cameraManager.supportDeviceFeatureExternalCamera) {
val usbListener = PlanetKitCameraManager.UsbCameraAvailabilityListener { isAvailable ->
if (isAvailable) {
Log.d(TAG, "External camera connected")
// Switch to external camera if desired
cameraManager.cameraType = PlanetKitCameraType.EXTERNAL
} else {
Log.d(TAG, "External camera disconnected")
// Fall back to front or back camera
cameraManager.cameraType = PlanetKitCameraType.FRONT
}
}
cameraManager.addUsbCameraAvailabilityListener(usbListener)
// Unregister when no longer needed
cameraManager.removeUsbCameraAvailabilityListener(usbListener)
}
관련 API
카메라 제어와 관련된 API는 다음과 같습니다.
클래스/인터페이스
-
PlanetKitCameraManager -
PlanetKitCameraManager.CameraTypeChangedListener -
PlanetKitCameraManager.StateListener -
PlanetKitCameraManager.UsbCameraAvailabilityListener
열거형
메서드
-
PlanetKitCameraManager의cameraType -
PlanetKitCameraManager의supportDeviceFeatureExternalCamera -
PlanetKitCameraManager의setManualResolution() -
PlanetKitCameraManager의setDefaultResolution() -
PlanetKitCameraManager의startPreview() -
PlanetKitCameraManager의stopPreview() -
PlanetKitCameraManager의addCameraTypeChangedListener() -
PlanetKitCameraManager의removeCameraTypeChangedListener() -
PlanetKitCameraManager의setStateListener() -
PlanetKitCameraManager의addUsbCameraAvailabilityListener() -
PlanetKitCameraManager의removeUsbCameraAvailabilityListener()
이벤트
-
PlanetKitCameraManager.StateListener의onStart -
PlanetKitCameraManager.StateListener의onStop -
PlanetKitCameraManager.StateListener의onError