iOS 카메라 기기 가이드

카메라 기기 유형은 푸시 기반 프로토콜을 사용하여 오디오 및 동영상 스트림 전송을 처리하는 PushAvStreamTransportTrait와 라이브 스트림 및 토크백을 제어하는 기능을 제공하는 WebRtcLiveViewTrait의 두 가지 특성을 사용하여 구현됩니다. 카메라 기능이 있는 구현의 경우 초인종 기기 유형도 이러한 특성을 사용합니다.

Home API 기기 유형 특성 Swift 샘플 앱 사용 사례

카메라

GoogleCameraDeviceType

home.matter.6006.types.0158

정지 이미지나 동영상을 캡처하는 기기 카메라에는 접근 가능한 라이브 스트림, 양방향 대화 또는 감지 활동이 포함될 수 있습니다.

필수 특성
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

카메라

초인종

GoogleDoorbellDeviceType

home.matter.6006.types.0113

문 밖에 있는 버튼으로 작동하며, 문 반대편에 있는 사람의 주의를 끌기 위해 사용되는 청각 및/또는 시각 신호를 내는 장치입니다. 초인종에는 접근 가능한 라이브 스트림, 양방향 TalkBack 또는 감지 활동이 포함될 수 있습니다.

필수 특성
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

초인종

라이브 스트림 시작

라이브 스트림을 시작하려면 세션 설명 프로토콜 (SDP) 문자열을 WebRtcLiveViewTrait 특성의 startLiveView(offerSdp:) 메서드에 전송합니다. 이 메서드는 다음 세 값을 반환합니다.

  • 세션의 SDP입니다.
  • 세션 시간(초)입니다.
  • 세션을 연장하거나 종료하는 데 사용할 수 있는 세션 ID입니다.
public func sendOffer(offerSdp: String) async throws 
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval) 
{
  do {
    Logger.info("Sending StartLiveView command...")
    let response = try await liveViewTrait.startLiveView(
      offerSdp: offerSdp
    )
    Logger.info("Received StartLiveView response: \(response)")
    return (
      answerSdp: response.answerSdp,
      mediaSessionId: response.mediaSessionId,
      liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
    )
  } catch {
    Logger.error("Failed to send StartLiveView command: \(error)")
    throw error
  }
}

라이브 스트림 연장하기

라이브 스트림에는 만료되는 사전 설정된 기간이 있습니다. 활성 스트림의 기간을 늘리려면 extendLiveView(mediaSessionId:optionalArgsProvider:) 메서드를 사용하여 연장 요청을 실행합니다.

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    Logger.info("Extending live view...")
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
    Logger.info("Extended live view for \(extendedDuration.liveSessionDurationSeconds) seconds.")
  } catch {
    Logger.error("Failed to extend live view: \(error)")
    throw error
  }
}

녹화 기능 사용 설정 및 사용 중지

카메라의 녹화 기능을 사용 설정하려면 TransportStatusEnum.ActivePushAvStreamTransportTrait 특성의 setTransportStatus(transportStatus:optionalArgsProvider:) 메서드에 전달합니다. 녹음 기능을 사용 중지하려면 TransportStatusEnum.Inactive을 전달합니다. 다음 예에서는 Boolean를 사용하여 녹화 기능을 전환하는 단일 호출로 이러한 호출을 래핑합니다.

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    Logger.error("PushAvStreamTransportTrait not found.")
    return
  }
  Task {
    do {
      Logger.debug("Toggling onOff to \(isOn ? "ON" : "OFF")...")
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          Logger.error("Failed to initialize WebRtcPlayer: \(error)")
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      Logger.error("Failed to toggle onOff: \(error)")
    }
  }
}

녹음 기능이 사용 설정되어 있는지 확인

카메라의 녹화 기능이 사용 설정되어 있는지 확인하려면 연결이 활성 상태인지 확인하세요. 다음 예에서는 이를 수행하는 두 함수를 정의합니다.

public func isDeviceRecording() -> Bool {
  guard let pushAvStreamTransportTrait else {
    Logger.error("PushAvStreamTransportTrait not found.")
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

TalkBack 시작 및 중지

토크백을 시작하려면 WebRtcLiveViewTrait 트레이트의 startTalkback(mediaSessionId:optionalArgsProvider:) 메서드를 호출합니다. 중지하려면 stopTalkback(mediaSessionId:)를 사용합니다.

public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
  do {
    Logger.info("Toggling twoWayTalk to \(isOn ? "ON" : "OFF")...")
    if isOn {
      try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
    } else {
      try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
    }
  } catch {
    throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
  }
}