راهنمای دستگاه دوربین برای iOS

نوع دستگاه دوربین با استفاده از دو ویژگی پیاده‌سازی می‌شود: PushAvStreamTransportTrait که انتقال جریان صدا و تصویر را با استفاده از پروتکل‌های مبتنی بر فشار مدیریت می‌کند و WebRtcLiveViewTrait که امکان کنترل پخش زنده و مکالمه را فراهم می‌کند. نوع دستگاه زنگ در، برای پیاده‌سازی‌هایی که دارای قابلیت‌های دوربین هستند، نیز از این ویژگی‌ها استفاده می‌کند.

نوع دستگاه APIهای خانگی صفات نمونه برنامه سویفت مورد استفاده

دوربین

Google Camera DeviceType

home.matter.6006.types.0158

دستگاهی که تصاویر ثابت یا ویدیو ضبط می‌کند. دوربین‌ها ممکن است دارای قابلیت پخش زنده، مکالمه دو طرفه یا تشخیص رویدادها باشند.

ویژگی‌های مورد نیاز
google PushAvStreamTransportTrait
گوگل WebRtcLiveViewTrait

دوربین

زنگ در

Google Doorbell DeviceType

home.matter.6006.types.0113

دستگاهی که توسط دکمه‌ای در بیرون در فعال می‌شود و سیگنال صوتی و/یا بصری ایجاد می‌کند و برای جلب توجه شخصی که در آن سوی در است، استفاده می‌شود. زنگ درها ممکن است دارای پخش زنده قابل دسترسی، مکالمه دو طرفه یا رویدادهای تشخیص باشند.

ویژگی‌های مورد نیاز
google PushAvStreamTransportTrait
گوگل WebRtcLiveViewTrait

زنگ در

شروع پخش زنده

برای شروع پخش زنده، رشته‌ی پروتکل شرح جلسه (SDP) را به متد startLiveView(offerSdp:) از ویژگی WebRtcLiveViewTrait ارسال کنید، که سه مقدار را برمی‌گرداند:

  • SDP برای جلسه.
  • مدت زمان جلسه بر حسب ثانیه.
  • شناسه جلسه، که ممکن است برای تمدید یا خاتمه جلسه استفاده شود.
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
  }
}

پخش زنده را تمدید کنید

پخش زنده (Livestream) دارای مدت زمان از پیش تعیین شده‌ای است که پس از آن منقضی می‌شود. برای افزایش مدت زمان یک پخش زنده فعال، با استفاده از متد 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.Active را به متد setTransportStatus(transportStatus:optionalArgsProvider:) از ویژگی PushAvStreamTransportTrait ارسال کنید. برای غیرفعال کردن قابلیت ضبط، آن را 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، متد startTalkback(mediaSessionId:optionalArgsProvider:) از ویژگی WebRtcLiveViewTrait را فراخوانی کنید. برای توقف آن، 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)")
  }
}