본문으로 건너뛰기
Version: 7.1

카메라 제어

이 가이드에서는 PlanetKit의 카메라 동작 및 관리 방법을 설명합니다.

  • 비디오 전송, 미리보기 상태, 통화 상태에 따라 PlanetKit이 내부적으로 카메라 켜짐/꺼짐을 결정하는 방식
  • 애플리케이션에서 제어할 수 있는 카메라 기능
지원 통화 유형최소 SDK 버전
1대1 통화, 그룹 통화(컨퍼런스)PlanetKit 5.5

카메라 켜짐/꺼짐 동작​

PlanetKit은 다음 조건 중 하나 이상이 충족되면 카메라를 켭니다.

  • 원격 피어에게 비디오가 전송 중인 경우
  • 하나 이상의 카메라 미리보기가 활성화된 경우

카메라는 두 조건 모두 충족되지 않을 때만 꺼집니다.

조건: 하나 이상의 미리보기가 활성화됨조건: 비디오가 전송 중임결과: 카메라 장치 상태
아니오아니오꺼짐
예아니오켜짐
아니오예켜짐
예예켜짐

다음 기능도 카메라 상태에 영향을 줍니다.

  • 초기 비디오 상태
    • 초기 비디오 전송 상태는 MakeCall(), AcceptCall(), JoinConference(), 또는 EnableVideo()에 전달되는 EInitialMyVideoState 유형의 속성/파라미터 값으로 제어합니다.
      • PLNK_INITIAL_MY_VIDEO_STATE_RESUME(기본값): 비디오가 활성 상태로 시작되며, 통화 시작 시 카메라가 켜집니다.
      • PLNK_INITIAL_MY_VIDEO_STATE_PAUSE: 비디오가 일시 정지 상태로 시작되며, ResumeMyVideo()가 호출될 때까지 카메라가 꺼진 상태를 유지합니다.
    • 초기 비디오 상태 설정에 관한 자세한 내용은 초기 비디오 상태를 참조하세요.
  • 통화 일시 중지/재개
    • Hold()를 호출하면 카메라가 꺼지고 비디오 전송이 비활성화됩니다.
    • Unhold()를 호출하면 카메라가 다시 켜지고 비디오 전송이 활성화됩니다.
    • 통화 일시 중지/재개에 관한 자세한 내용은 통화 일시 중지를 참조하세요.
  • 비디오 일시 정지/재개
    • PauseMyVideo()를 호출하면 카메라가 꺼지고 비디오 전송이 비활성화됩니다.
    • ResumeMyVideo()를 호출하면 카메라가 다시 켜지고 비디오 전송이 활성화됩니다.
Note

1대1 영상 통화에서 수신자가 통화가 완전히 연결되기 전에 응답자 준비 상태에 진입하면, PlanetKit은 비디오가 네트워크에 전송되기 전에 카메라를 켤 수 있습니다. 이 단계에서도 PauseMyVideo()와 ResumeMyVideo()는 카메라를 정상적으로 끄거나 켜지만, 실제 비디오 전송은 준비가 완료된 후에만 시작됩니다.

카메라 제어 기능​

PlanetKit은 카메라 장치 목록 조회, 선택, 설정을 위한 카메라 관리 API를 제공합니다.

  • 카메라 전환, 미리보기 시작/종료, 카메라 관련 이벤트 처리에는 PlanetKit::CameraController를 사용하세요. 캡처 해상도 및 프레임 레이트 설정에는 PlanetKit::CameraInfo를 사용하세요.
  • 포커스 제어에는 PlanetKit::CameraInfo의 API를 사용하세요.
Note

포커스 제어 기능은 PlanetKit 7.1 이상 버전에서 사용 가능합니다.

카메라 목록 조회 및 선택​

GetCapturerInfo()를 호출하여 사용 가능한 카메라를 조회한 후, ChangeCamera()를 호출하여 카메라를 활성화합니다.

auto pController = PlanetKit::PlanetKitManager::GetInstance()->GetCameraController();

PlanetKit::CameraInfoArray arrCameras;
pController->GetCapturerInfo(arrCameras);

for (const auto& pCamera : arrCameras) {
std::wcout << L"Camera: " << pCamera->GetDeviceName() << std::endl;
}

// Select the first camera
if (!arrCameras.empty()) {
pController->ChangeCamera(arrCameras[0]);
}

선호 해상도 및 프레임 레이트 설정​

ChangeCamera()를 호출하기 전후에 CameraInfo에서 SetPreferredResolution()과 SetPreferredMaxFps()를 설정합니다.

auto pCamera = arrCameras[0];

// Set preferred resolution (default: HD 1280x720)
pCamera->SetPreferredResolution(PlanetKit::PLNK_CAMERA_RESOLUTION_HD);

// Set preferred maximum FPS (default: device default)
pCamera->SetPreferredMaxFps(PlanetKit::PLNK_VIDEO_CAPTURE_FPS_30);

pController->ChangeCamera(pCamera);

사용 가능한 ECameraResolution 값은 다음과 같습니다.

값크기
PLNK_CAMERA_RESOLUTION_VGA640×480
PLNK_CAMERA_RESOLUTION_VGA_16_9640×360
PLNK_CAMERA_RESOLUTION_HD1280×720(기본값)
PLNK_CAMERA_RESOLUTION_FHD1920×1080

사용 가능한 EVideoCaptureFps 값은 다음과 같습니다.

값프레임 레이트
PLNK_VIDEO_CAPTURE_FPS_DEFAULT장치 기본값
PLNK_VIDEO_CAPTURE_FPS_55 fps
PLNK_VIDEO_CAPTURE_FPS_1010 fps
PLNK_VIDEO_CAPTURE_FPS_1515 fps
PLNK_VIDEO_CAPTURE_FPS_2424 fps
PLNK_VIDEO_CAPTURE_FPS_3030 fps(최대)

카메라 미리보기​

StartPreview()와 StopPreview()를 사용하여 통화와 독립적으로 카메라 미리보기를 시작하고 중지할 수 있습니다.

// Preview into a window handle
pController->StartPreview(hWnd);
pController->StopPreview(hWnd);

// Or preview into an IVideoReceiver
pController->StartPreview(pVideoReceiver);
pController->StopPreview(pVideoReceiver);

장치 변경 이벤트 처리​

카메라가 추가되거나 제거될 때, 또는 오류가 발생할 때 알림을 받으려면 IVideoCaptureDeviceEvent를 등록합니다.

class MyCameraDeviceEvent : public PlanetKit::IVideoCaptureDeviceEvent {
public:
void OnDeviceAdded(PlanetKit::CameraInfoPtr pCameraInfo) override {
std::wcout << L"Camera added: " << pCameraInfo->GetDeviceName() << std::endl;
}

void OnDeviceRemoved(PlanetKit::CameraInfoPtr pCameraInfo) override {
std::wcout << L"Camera removed: " << pCameraInfo->GetDeviceName() << std::endl;
// Switch to another camera if this was the active one
}

void OnCameraError(PlanetKit::ECameraControlResult eCameraControlResult) override {
std::wcout << L"Camera error: " << eCameraControlResult << std::endl;
}
};

auto pDeviceEvent = PlanetKit::MakeShared<MyCameraDeviceEvent>();
pController->RegisterDeviceEvent(pDeviceEvent);

// Deregister when no longer needed
pController->DeregisterDeviceEvent(pDeviceEvent);

포커스 제어​

PlanetKit은 포커스 제어를 지원하는 카메라에 대해 PlanetKit::CameraInfo를 통해 포커스 API를 제공합니다. 포커스 설정은 CameraInfo 인스턴스별로 관리되므로, 각 카메라 장치는 독립적인 포커스 모드 및 수동 포커스 값을 갖습니다.

Note

GetCapturerInfo()가 호출되면 PlanetKit은 각 카메라를 잠깐 활성화하여 포커스 기능을 조회하고 그 결과를 CameraInfo에 캐시합니다. 따라서 IsFocusModeSupported()는 ChangeCamera()가 호출되기 전, GetCapturerInfo()가 반환된 직후에 정확한 값을 반환합니다. 조회 중 잠깐 활성화되는 동작은 카메라 LED를 켜거나 "카메라 켜짐" 알림을 발생시키지 않습니다.

포커스 지원 여부 확인​

포커스 API를 호출하기 전에 카메라가 원하는 포커스 모드를 지원하는지 확인하세요. 고정 포커스 카메라는 모든 모드에 대해 false를 반환합니다.

bool bAutoSupported   = pCamera->IsFocusModeSupported(PlanetKit::PLNK_FOCUS_MODE_AUTO);
bool bManualSupported = pCamera->IsFocusModeSupported(PlanetKit::PLNK_FOCUS_MODE_MANUAL);

if (!bAutoSupported && !bManualSupported) {
// Fixed-focus camera — focus control is not available
}

포커스 모드 조회 및 설정​

현재 모드를 읽으려면 GetFocusMode()를, 변경하려면 SetFocusMode()를 사용합니다.

  • 카메라가 활성화된 상태(카메라 장치가 열려 있고 작동 중인 경우)에서 SetFocusMode()로 변경하면, 카메라를 중지했다가 다시 시작하지 않아도 다음 캡처 사이클에 변경이 적용됩니다.
  • 카메라가 활성 상태가 아닌 경우, 값은 선호 설정으로 저장되며 카메라가 활성화될 때 적용됩니다.
// Get current mode
PlanetKit::EFocusMode currentMode;
auto result = pCamera->GetFocusMode(currentMode);
if (result == PlanetKit::PLNK_FOCUS_CONTROL_RESULT_SUCCESS) {
std::wcout << L"Current focus mode: " << currentMode << std::endl;
}

// Set to auto focus — enters auto mode and triggers autofocus in one call.
// Continuous-AF cameras focus continuously; one-shot AF cameras focus once.
if (bAutoSupported) {
pCamera->SetFocusMode(PlanetKit::PLNK_FOCUS_MODE_AUTO);
}

// Set to manual focus — uses the last manual focus value
if (bManualSupported) {
pCamera->SetFocusMode(PlanetKit::PLNK_FOCUS_MODE_MANUAL);
}

수동 포커스 값 조회 및 설정​

수동 포커스 값을 설정하려면 SetManualFocusValue()를, 현재 수동 포커스 값을 조회하려면 GetManualFocusValue()를 사용합니다.

  • SetManualFocusValue()는 수동 포커스 값만 설정합니다. 포커스 모드는 변경하지 않습니다.
  • 수동 포커스 값은 PlanetKit이 카메라의 네이티브 포커스 범위에 선형적으로 매핑하는 0–100의 정규화된 값입니다.
Note

GetManualFocusValue()는 카메라 하드웨어에서 직접 값을 읽으므로, 다른 애플리케이션이 값을 변경한 경우 마지막으로 설정한 값과 다를 수 있습니다.

// Set manual focus value (0–100)
auto result = pCamera->SetManualFocusValue(50);
if (result != PlanetKit::PLNK_FOCUS_CONTROL_RESULT_SUCCESS) {
// Handle: NOT_SUPPORTED, OUT_OF_RANGE, or INTERNAL_ERROR
}

// Get manual focus value
unsigned int nValue = pCamera->GetManualFocusValue();

상태에 따른 SetManualFocusValue()의 동작은 다음과 같습니다.

상태효과
현재 모드가 MANUAL이고 카메라가 활성 상태다음 캡처 사이클에 즉시 적용됨
현재 모드가 AUTO이고 카메라가 활성 상태내부적으로 저장되며, SetFocusMode(MANUAL) 호출 시 적용됨
카메라가 활성 상태가 아님선호 값으로 저장되며, 모드가 MANUAL인 경우 카메라가 활성화될 때 적용됨

카메라 시작 전 포커스 설정​

카메라가 활성 상태가 아닐 때 CameraInfo에 포커스 모드와 값을 설정할 수 있습니다. PlanetKit은 카메라가 활성화될 때 저장된 설정을 적용합니다.

PlanetKit::CameraInfoArray arrCameras;
pController->GetCapturerInfo(arrCameras);
auto pCamera = arrCameras[0];

if (pCamera->IsFocusModeSupported(PlanetKit::PLNK_FOCUS_MODE_MANUAL)) {
pCamera->SetManualFocusValue(50); // store preferred value
pCamera->SetFocusMode(PlanetKit::PLNK_FOCUS_MODE_MANUAL); // set mode to manual
}

pController->ChangeCamera(pCamera); // camera starts in manual mode at value 50

포커스 제어 결과 코드​

GetFocusMode(), SetFocusMode(), SetManualFocusValue()는 모두 EFocusControlResult를 반환합니다. 지원되지 않는 하드웨어나 OS 수준의 오류를 감지하려면 반환 값을 확인하세요.

코드의미
PLNK_FOCUS_CONTROL_RESULT_SUCCESS작업 성공
PLNK_FOCUS_CONTROL_RESULT_NOT_SUPPORTED요청한 포커스 모드가 지원되지 않거나, 카메라에 포커스 제어 기능이 없음
PLNK_FOCUS_CONTROL_RESULT_OUT_OF_RANGESetManualFocusValue()에 전달된 값이 0–100 범위를 벗어남
PLNK_FOCUS_CONTROL_RESULT_INTERNAL_ERROR기본 OS API 호출 실패

관련 API​

카메라 제어와 관련된 API는 다음과 같습니다.

클래스/인터페이스​

열거형​

메서드​

이벤트​

관련 문서​