Hướng dẫn sử dụng thiết bị camera cho iOS

Loại thiết bị Camera được triển khai bằng 2 đặc điểm: PushAvStreamTransportTrait, xử lý việc truyền luồng âm thanh và video bằng giao thức dựa trên lệnh đẩy và WebRtcLiveViewTrait, cung cấp khả năng kiểm soát luồng phát trực tiếp và tính năng phản hồi bằng giọng nói. Loại thiết bị Chuông cửa (đối với những cách triển khai có chức năng camera) cũng sử dụng các đặc điểm này.

Loại thiết bị Home API Đặc điểm Ứng dụng mẫu Swift Trường hợp sử dụng

Máy ảnh

GoogleCameraDeviceType

home.matter.6006.types.0158

Thiết bị chụp ảnh tĩnh hoặc quay video. Camera có thể có tính năng phát trực tiếp, đàm thoại hai chiều hoặc phát hiện sự kiện.

Đặc điểm bắt buộc
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Camera

Chuông cửa

GoogleDoorbellDeviceType

home.matter.6006.types.0113

Một thiết bị được kích hoạt bằng nút bên ngoài cửa, tạo ra tín hiệu âm thanh và/hoặc hình ảnh, dùng để yêu cầu sự chú ý của một người ở phía bên kia cửa. Chuông cửa có thể có tính năng phát trực tiếp, đàm thoại hai chiều hoặc phát hiện sự kiện.

Đặc điểm bắt buộc
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Chuông cửa

Bắt đầu phát trực tiếp

Để bắt đầu một sự kiện phát trực tiếp, hãy gửi chuỗi Giao thức mô tả phiên (SDP) đến phương thức startLiveView(offerSdp:) của đặc điểm WebRtcLiveViewTrait. Phương thức này sẽ trả về 3 giá trị:

  • SDP cho phiên.
  • Thời lượng phiên tính bằng giây.
  • Mã phiên, có thể dùng để kéo dài hoặc kết thúc phiên.
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
  }
}

Kéo dài thời gian phát trực tiếp

Các sự kiện phát trực tiếp có thời lượng đặt sẵn và sẽ hết hạn sau thời lượng đó. Để kéo dài thời lượng của một luồng đang hoạt động, hãy đưa ra yêu cầu gia hạn bằng phương thức 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
  }
}

Bật và tắt tính năng ghi âm

Để bật chức năng ghi hình của camera, hãy truyền TransportStatusEnum.Active đến phương thức setTransportStatus(transportStatus:optionalArgsProvider:) của đặc điểm PushAvStreamTransportTrait. Để tắt khả năng ghi, hãy truyền TransportStatusEnum.Inactive. Trong ví dụ sau, chúng ta sẽ gói các lệnh gọi này trong một lệnh gọi duy nhất sử dụng Boolean để bật/tắt khả năng ghi:

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)")
    }
  }
}

Kiểm tra xem bạn có bật tính năng ghi hình hay không

Để xác định xem camera có được bật tính năng ghi hình hay không, hãy kiểm tra xem có kết nối nào đang hoạt động hay không. Ví dụ sau đây xác định 2 hàm để thực hiện việc này:

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
}

Bắt đầu và dừng TalkBack

Để bắt đầu TalkBack, hãy gọi phương thức startTalkback(mediaSessionId:optionalArgsProvider:) của đặc điểm WebRtcLiveViewTrait. Để dừng, hãy dùng biểu tượng 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)")
  }
}