ประเภทอุปกรณ์กล้องจะใช้งานโดยใช้ 2 ลักษณะต่อไปนี้
PushAvStreamTransportTrait
ซึ่งจัดการการรับส่งสตรีมเสียงและวิดีโอโดยใช้โปรโตคอลแบบพุช และ
WebRtcLiveViewTrait
ซึ่งช่วยให้ควบคุมไลฟ์สดและ Talkback ได้
โปรดตรวจสอบการรองรับแอตทริบิวต์และคำสั่งของอุปกรณ์ก่อนใช้ฟีเจอร์หรือพยายามอัปเดตแอตทริบิวต์เสมอ ดูข้อมูลเพิ่มเติมได้ที่ควบคุมอุปกรณ์ใน iOS
| ประเภทอุปกรณ์ API สำหรับ Home | ลักษณะ | แอปตัวอย่าง Swift | กรณีการใช้งาน |
|---|---|---|---|
|
กล้อง
อุปกรณ์ที่ถ่ายภาพนิ่งหรือวิดีโอ กล้องอาจมีฟีเจอร์สตรีมแบบสดที่เข้าถึงได้ การพูดโต้ตอบแบบ 2 ทาง หรือเหตุการณ์ที่ตรวจพบ |
ลักษณะที่ต้องระบุ google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
กล้อง |
ดูข้อมูลพื้นฐานเกี่ยวกับอุปกรณ์
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
ลักษณะBasicInformation
ประกอบด้วยข้อมูล เช่น ชื่อผู้ให้บริการ รหัสผู้ให้บริการ รหัสผลิตภัณฑ์
ชื่อผลิตภัณฑ์ (รวมถึงข้อมูลรุ่น) และเวอร์ชันซอฟต์แวร์สำหรับอุปกรณ์
let vendorName = basicInfoTrait.attributes.vendorName! let vendorID = basicInfoTrait.attributes.vendorID! let productID = basicInfoTrait.attributes.productID! let productName = basicInfoTrait.attributes.productName! let softwareVersion = basicInfoTrait.attributes.softwareVersion!
รับหมายเลขซีเรียล
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
หากต้องการรับหมายเลขซีเรียลของอุปกรณ์ ให้ใช้คำสั่ง
GetSerialNumber ของลักษณะ
ExtendedBasicInformation
ตัวอย่างแสดงการบันทึกหมายเลขซีเรียลในตัวแปรชื่อ serialNumber
// Assuming extendedBasicInformationTrait: Google.ExtendedBasicInformationTrait let response = try await extendedBasicInformationTrait.getSerialNumber() let serialNumber = response.serialNumber
รับเวลาล่าสุดที่อุปกรณ์ติดต่อกับระบบคลาวด์
หากต้องการดูเวลาล่าสุดที่อุปกรณ์ติดต่อกับระบบคลาวด์ ให้ใช้lastContactTimestampแอตทริบิวต์ของลักษณะExtendedGeneralDiagnostics
if let lastContactTimeStamp = extendedGeneralDiagnosticsTrait.attributes.lastContactTimestamp { self.lastContactTime = Date(timeIntervalSince1970: Double(lastConnectedTimeStamp)) }
การตั้งค่าประเภทขายึดกล้อง
คุณลักษณะ Mount
มีข้อมูลการตั้งค่าและสถานะของกล้อง คุณอ่าน
แอตทริบิวต์ เช่น สถานะการติดตั้ง ประเภทการตรวจหา และชื่อประเภทการติดตั้งได้
นอกจากนี้ คุณยังใช้ลักษณะ Mount เพื่อลบล้างการกำหนดค่าประเภทการติดตั้งเริ่มต้นได้ด้วย
// 1. Get the Mount trait guard let mountTrait = deviceType.traits[Google.MountTrait.self] else { print("Mount trait not supported or configured on this device.") return } // 2. Read the current mount state, detection type, and type name let mountState = mountTrait.attributes.mountState // Type: Google.MountTrait.MountStateEnum? let mountDetectionType = mountTrait.attributes.mountDetectionType // Type: Google.MountTrait.MountDetectionTypeEnum? let mountTypeName = mountTrait.attributes.mountTypeName // Type: String? // 3. Update the mount type override try await mountTrait.update { mutableTrait in mutableTrait.setMountTypeOverride(.official) }
ตรวจสอบการเชื่อมต่อสำหรับอุปกรณ์
ระบบจะตรวจสอบการเชื่อมต่อของอุปกรณ์ที่ระดับประเภทอุปกรณ์ เนื่องจากอุปกรณ์บางเครื่องรองรับอุปกรณ์หลายประเภท สถานะที่ส่งคืนคือ การรวมสถานะการเชื่อมต่อสำหรับลักษณะทั้งหมดในอุปกรณ์นั้น
let lightConnectivity = dimmableLightDeviceType.metadata.sourceConnectivity .connectivityState
สถานะ partiallyOnline อาจปรากฏในกรณีที่มีอุปกรณ์หลายประเภท
เมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ต Matter ลักษณะมาตรฐาน
อาจยังออนไลน์อยู่เนื่องจากการกำหนดเส้นทางในพื้นที่ แต่ลักษณะที่อิงตามระบบคลาวด์จะ
ออฟไลน์
รับที่อยู่ IP ของอุปกรณ์
หากต้องการค้นหาที่อยู่ IP ของอุปกรณ์ ให้ใช้แอตทริบิวต์ networkInterfaces ของ
GeneralDiagnosticsTrait
ระบบจะแสดงที่อยู่เป็นออบเจ็กต์ Data ซึ่งคุณจัดรูปแบบเป็นสตริง IPv4 หรือ IPv6 มาตรฐานได้โดยใช้เฟรมเวิร์ก Network
func getIpAddresses(trait: Matter.GeneralDiagnosticsTrait) -> [String] {
let interfaces = trait.attributes.networkInterfaces ?? []
var ipAddresses: [String] = []
for interface in interfaces {
for data in interface.iPv4Addresses {
if let ipv4 = IPv4Address(data) {
ipAddresses.append(String(describing: ipv4))
}
}
for data in interface.iPv6Addresses {
if let ipv6 = IPv6Address(data) {
ipAddresses.append(String(describing: ipv6))
}
}
}
return ipAddresses
}
เริ่มไลฟ์สด
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
หากต้องการเริ่มไลฟ์สด ให้ส่งสตริง Session Description Protocol (SDP)
ไปยังเมธอด
WebRtcLiveViewTrait
ของลักษณะ
startLiveView(offerSdp:)
ซึ่งจะแสดงค่า 3 ค่า ได้แก่
- SDP สำหรับเซสชัน
- ระยะเวลาเซสชันเป็นวินาที
- รหัสเซสชัน ซึ่งอาจใช้เพื่อขยายหรือสิ้นสุดเซสชัน
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
// Sending StartLiveView command
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
// Received StartLiveView response
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
// Failed to send StartLiveView command
throw error
}
}
ขยายเวลาไลฟ์สด
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
ไลฟ์สดมีระยะเวลาที่กำหนดไว้ล่วงหน้าซึ่งจะหมดอายุหลังจากนั้น หากต้องการขยาย
ระยะเวลาของสตรีมที่ใช้งานอยู่ ให้ส่งคำขอขยายเวลาโดยใช้เมธอด
extendLiveView(mediaSessionId:optionalArgsProvider:)
public func extendLiveView(mediaSessionId: String) async throws {
do {
// Extending live view
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
} catch {
// Failed to extend live view
throw error
}
}
เริ่มและหยุด TalkBack
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
หากต้องการเริ่ม Talkback ให้เรียกใช้เมธอด startTalkback(mediaSessionId:optionalArgsProvider:) ของลักษณะ WebRtcLiveViewTrait
หากต้องการหยุด ให้ใช้ stopTalkback(mediaSessionId:)
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
if isOn {
try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
} else {
try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
}
} catch {
throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
}
}
จัดการไลฟ์สด
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
การปรับคุณภาพไลฟ์สดมีประโยชน์ในการเพิ่มประสิทธิภาพการใช้แบนด์วิดท์ตามบริบทการรับชมของไคลเอ็นต์ (เช่น การเปลี่ยนไปใช้ความละเอียดที่ต่ำลงเมื่อแสดงไทล์ตัวอย่างขนาดเล็ก มุมมองตาราง หรือโหมดการแสดงภาพซ้อนภาพ)
การเปลี่ยนคุณภาพแบบไดนามิกโดยใช้ลักษณะWebRtcLiveView
จะจัดการความละเอียดของเซสชันไลฟ์สดที่ทำงานอยู่
ในไคลเอ็นต์หนึ่งๆ โดยเฉพาะ การตั้งค่านี้ไม่เหมือนกับการกำหนดค่าการตั้งค่าการใช้แบนด์วิดท์ทั่วทั้งอุปกรณ์โดยตรงในอุปกรณ์ ซึ่งจะส่งผลต่อผู้ชมพร้อมกันทั้งหมดและคุณภาพของการบันทึกวิดีโอที่ผ่านมาซึ่งบันทึกลงในระบบคลาวด์
ตัวอย่างต่อไปนี้แสดงวิธีดึงและอัปเดตคุณภาพของไลฟ์สดสำหรับอุปกรณ์
ดึงตัวเลือกคุณภาพที่รองรับ: รับความละเอียดในการสตรีมที่มี ซึ่งอุปกรณ์รองรับ โค้ดจะค้นหาลักษณะ
WebRtcLiveViewเพื่อแสดงคุณภาพสตรีมที่รองรับเป็นรายการค่าQualityHint(เช่น.sd,.hd,.fhd,.qhdหรือ.uhd) โดยใช้พร็อพเพอร์ตี้supportedQualityHintsเปลี่ยนคุณภาพไลฟ์สด: ใช้
QualityHintที่เลือกเพื่อเปลี่ยน ความละเอียดการสตรีมของไลฟ์สดที่กำลังดำเนินอยู่ (เช่น เปลี่ยนจากความละเอียดมาตรฐานเป็นความละเอียดสูง) ฟังก์ชันupdateQualityHintใช้เมธอดchangeLiveViewQualityของลักษณะWebRtcLiveViewเพื่อใช้การกำหนดค่าQualityHintที่เลือกกับเซสชันสื่อที่ใช้งานอยู่
public var supportedQualityHints: [Google.WebRtcLiveViewTrait.QualityHint] { return liveViewTrait?.attributes.supportedQualityHints ?? [] } public func updateQualityHint( liveViewTrait: Google.WebRtcLiveViewTrait, hint: Google.WebRtcLiveViewTrait.QualityHint, mediaSessionId: String ) async { do { _ = try await liveViewTrait.changeLiveViewQuality( mediaSessionId: mediaSessionId, qualityHint: hint ) } catch { // error } }
เปิดและปิดใช้ความสามารถในการบันทึก
หากต้องการเปิดใช้ความสามารถในการบันทึกของกล้อง ให้ส่ง
TransportStatusEnum.Active
ไปยังเมธอด
setTransportStatus(transportStatus:optionalArgsProvider:)
ของลักษณะ
PushAvStreamTransportTrait หากต้องการปิดใช้ความสามารถในการบันทึก ให้ส่งTransportStatusEnum.Inactive
ในตัวอย่างต่อไปนี้ เราจะรวมการเรียกเหล่านี้ไว้ในการเรียกครั้งเดียวที่ใช้
Boolean เพื่อสลับความสามารถในการบันทึก
public func toggleIsRecording(isOn: Bool) {
self.uiState = .loading
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return
}
Task {
do {
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
// Failed to initialize WebRtcPlayer
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
// Failed to toggle onOff
}
}
}
การเปิดหรือปิดใช้ความสามารถในการบันทึกของกล้องจะเหมือนกับการเปิดหรือปิดวิดีโอของกล้อง เมื่อวิดีโอของกล้องเปิดอยู่ กล้องจะบันทึก (เพื่อวัตถุประสงค์ของเหตุการณ์และคลิปที่เกี่ยวข้อง)
เมื่อปิดใช้ความสามารถในการบันทึก (วิดีโอจากกล้องปิดอยู่)
- กล้องอาจยังคงแสดงเป็นออนไลน์ตาม
connectivityStateของ ประเภทอุปกรณ์ - เข้าถึงไลฟ์สดไม่ได้ และกล้องไม่ตรวจพบเหตุการณ์ในระบบคลาวด์
ตรวจสอบว่าได้เปิดใช้ความสามารถในการบันทึกหรือไม่
หากต้องการดูว่าเปิดใช้ความสามารถในการบันทึกของกล้องหรือไม่ ให้ตรวจสอบว่ามีการเชื่อมต่อที่ใช้งานอยู่หรือไม่ ตัวอย่างต่อไปนี้กำหนดฟังก์ชัน 2 รายการเพื่อดำเนินการนี้
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
ดึงข้อมูลสแนปชอตจากกล้อง
ใช้ลักษณะ CameraSnapshot เพื่อดึงสแนปชอตรูปภาพนิ่งจากกล้อง
สแนปชอตเหล่านี้มีประโยชน์ในหลายสถานการณ์ ดังนี้
- เป็นการ์ดตัวยึดตำแหน่งใน UI ขณะที่ไลฟ์สด WebRTC กำลังโหลด
- เป็นภาพตัวอย่างแบบคงที่ซึ่งอัปเกรดเป็นไลฟ์สดเมื่อผู้ใช้ โต้ตอบ
- เป็น Canvas พื้นหลังสำหรับการวาดและกำหนดค่าโซนกิจกรรมที่กำหนดเอง
คุณลักษณะ CameraSnapshot มี 2 วิธีในการดึงข้อมูลสแนปชอต ทั้งนี้ขึ้นอยู่กับว่าคุณต้องการสแนปชอตที่แคชไว้เพื่อการแสดงผลที่รวดเร็วหรือสแนปชอตสดแบบออนดีมานด์
รับสแนปชอตตัวอย่างที่แคชไว้
ภาพรวมตัวอย่างคือรูปภาพที่แคชไว้ซึ่ง SDK สามารถดึงข้อมูลได้โดยไม่ต้องเปิดกล้อง นี่เป็นวิธีที่เร็วที่สุดในการดึงข้อมูลรูปภาพแบบคงที่ และเหมาะสำหรับ หน้าภาพรวมของกล้องหรือตารางแดชบอร์ด
หากต้องการดูสแนปชอตตัวอย่าง ให้อ่านpreview_image_urlแอตทริบิวต์ลักษณะpreview_image_url
guard let cameraSnapshotTrait = deviceType.traits[ Google.CameraSnapshotTrait.self ] else { print("CameraSnapshot trait not supported on this device.") return } if let previewImageUrlString = cameraSnapshotTrait .attributes.preview_image_url, let url = URL(string: previewImageUrlString) { // Load the preview image from the URL }
URL ตัวอย่างจะชี้ไปยัง รูปภาพที่แคชซึ่งสร้างจากฟุตเทจวิดีโอล่าสุด (I-frame แรกของ วิดีโอชิ้นล่าสุด) หรือสแนปชอตที่กล้องอัปโหลดเป็นระยะๆ ทั้งนี้ขึ้นอยู่กับการกำหนดค่ากล้องและกิจกรรม
ระบบคลาวด์ของ Google Home จะฝังส่วนหัว
X-Home-Image-Captured-Atในรูปภาพ JPEG/PNG ที่แสดงผล ซึ่งจัดรูปแบบเป็น UTC เพื่อระบุความใหม่ของรูปภาพ คุณแยกวิเคราะห์ส่วนหัวนี้ในฝั่งไคลเอ็นต์เพื่อแสดงอายุของสแนปชอตในแอปได้
ดูสแนปชอตสดแบบออนดีมานด์
สำหรับเส้นทางของผู้ใช้ที่ต้องใช้ฟีเจอร์ดูภาพสดปัจจุบันของกล้อง เช่น การตั้งค่าโซนตรวจจับกิจกรรม คุณสามารถขอภาพรวมสดได้ การทริกเกอร์สแนปชอตสด จะสั่งให้กล้องปลุกตัวเอง จับภาพเฟรมใหม่ และอัปโหลดไปยัง ระบบคลาวด์
หากต้องการขอสแนปชอตสด ให้ใช้คำสั่ง getLiveSnapshot()
do { let response = try await cameraSnapshotTrait.getLiveSnapshot() let snapshotUrlString = response.snapshot_url if let url = URL(string: snapshotUrlString) { // Load the live snapshot image from the URL } } catch { print("Failed to get live snapshot: \(error)") }
ตรวจสอบสิทธิ์คำขอสแนปชอต
URL ของภาพรวมทั้งหมดจะชี้ไปยังสื่อที่ปลอดภัยและต้องใช้โทเค็น OAuth 2.0 สำหรับขอบเขต Home APIs v2 หากต้องการดาวน์โหลดและแสดงรูปภาพ คุณต้องแทรกโทเค็น OAuth เป็นโทเค็น Bearer ในส่วนหัว Authorization ของคำขอ HTTP
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าคำขอเครือข่ายที่ปลอดภัย เพื่อดาวน์โหลดสแนปชอต
import UIKit func loadSnapshotImage(from url: URL, home: Home) async -> UIImage? { do { // 1. Retrieve the OAuth access token from the Home APIs SDK let (accessToken, _) = try await home.permissions.authorization() // 2. Configure the HTTP GET request with the Bearer token var request = URLRequest(url: url) request.setValue( "Bearer \(accessToken)", forHTTPHeaderField: "Authorization" ) // 3. Fetch the image data let (data, _) = try await URLSession.shared.data(for: request) return UIImage(data: data) } catch { print("Error loading snapshot image: \(error)") return nil } }
การตั้งค่าแบตเตอรี่
คุณควบคุมการตั้งค่าแบตเตอรี่ต่างๆ ได้ผ่าน Home API
ตั้งค่ากำหนดการใช้งานแบตเตอรี่
การตั้งค่าสมดุลพลังงานช่วยให้คุณกำหนดค่าการแลกเปลี่ยนระหว่างระยะเวลาการใช้งานแบตเตอรี่กับประสิทธิภาพของอุปกรณ์ได้ คุณสร้างโปรไฟล์แบตเตอรี่ต่างๆ ได้ เช่น "ขยายเวลา" "สมดุล" และ "ประสิทธิภาพ" แล้วสลับไปมาระหว่างโปรไฟล์เหล่านั้นได้
ฟีเจอร์นี้จะใช้งานได้โดยการอัปเดตแอตทริบิวต์
currentEnergyBalance
ของลักษณะ EnergyPreference แอตทริบิวต์นี้ยอมรับดัชนีจำนวนเต็ม
ที่สอดคล้องกับโปรไฟล์ที่เฉพาะเจาะจงซึ่งกำหนดไว้ในรายการ energyBalances ของอุปกรณ์ (เช่น 0 สำหรับ EXTENDED, 1 สำหรับ BALANCED และ 2 สำหรับ PERFORMANCE)
null ค่าสำหรับ currentEnergyBalance แสดงว่าอุปกรณ์ใช้โปรไฟล์ที่กำหนดเอง
นี่คือสถานะอ่านอย่างเดียว
ต่อไปนี้เป็นตัวอย่างโครงสร้างที่แอตทริบิวต์ currentEnergyBalance
จะใช้ ตามด้วยข้อมูลโค้ดจริงที่ใช้แอตทริบิวต์
// Example energyBalances list { "energy_balances": [ { "step": 0, "label": "EXTENDED" }, { "step": 50, "label": "BALANCED" }, { "step": 100, "label": "PERFORMANCE" } ] }
private func setBatteryUsage(to option: UInt8) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentEnergyBalance(option) } }
เปิดโหมดประหยัดแบตเตอรี่อัตโนมัติ
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
หากต้องการกำหนดค่าฟีเจอร์นี้ ให้อัปเดตแอตทริบิวต์
currentLowPowerModeSensitivity
ของลักษณะEnergyPreference
แอตทริบิวต์นี้ใช้อินเด็กซ์
เพื่อเลือกระดับความละเอียด โดยที่ 0 มักจะแสดง Disabled
และ 1 แสดง Enabled หรือ Automatic
private func setAutoBatterySaver(to value: Bool) async throws { _ = try await energyPreferenceTrait.update { $0.setCurrentLowPowerModeSensitivity(value ? 1 : 0) } }
รับสถานะการชาร์จแบตเตอรี่
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
หากต้องการดูสถานะการชาร์จปัจจุบันของอุปกรณ์ (กำลังชาร์จ ชาร์จเต็มแล้ว หรือไม่ได้ชาร์จ) ให้ใช้แอตทริบิวต์
batChargeState
ของลักษณะ
PowerSource
self.chargingState = powerSourceTrait.attributes.batChargeState var description: String switch self.chargingState { case .isCharging: description = "Charging" case .isAtFullCharge: description = "Full" case .isNotCharging: description = "Not Charging" default: description = "Unknown" }
ดูระดับแบตเตอรี่
หากต้องการดูระดับแบตเตอรี่ปัจจุบัน ให้ใช้แอตทริบิวต์
batChargeLevel
ของลักษณะ
PowerSource
ระดับคือ OK, Warning (ต่ำ) หรือ Critical
self.batteryLevel = powerSourceTrait.attributes.batChargeLevel var description: String switch self.batteryLevel { case .ok: description = "OK" case .warning: description = "Warning" case .critical: description = "Critical" default: description = "Unknown" }
เตรียมแหล่งจ่ายไฟ
หากต้องการระบุแหล่งพลังงานที่อุปกรณ์ใช้ ให้ใช้แอตทริบิวต์ BatPresent
และ
wiredPresent
ของลักษณะ PowerSource
if powerSourceTrait.attributes.wiredPresent ?? false { self.powerSourceType = .wired } else if powerSourceTrait.attributes.batPresent ?? false { self.powerSourceType = .battery } else { self.powerSourceType = nil }
ตรวจสอบว่าต้องเปลี่ยนแบตเตอรี่หรือไม่
แอตทริบิวต์ batReplaceability
จะระบุว่าแบตเตอรี่เปลี่ยนไม่ได้ ผู้ใช้เปลี่ยนได้ หรือ
เปลี่ยนจากโรงงานได้
หากเปลี่ยนแบตเตอรี่ได้ แอตทริบิวต์
batReplacementNeeded
ของลักษณะ
PowerSource
จะบอกว่าคุณต้องเปลี่ยนแบตเตอรี่หรือไม่
// Get the battery replacement status var batteryStatus = powerSourceTrait.attributes.batReplacementNeeded if batteryStatus { print("Replace the battery.") }
เมื่อแบตเตอรี่สามารถเปลี่ยนได้โดยผู้ใช้
batReplacementDescription
จะอธิบายแบตเตอรี่ รวมถึงข้อมูลต่างๆ เช่น รูปแบบทางกายภาพ สารเคมี และ
ผู้ผลิตที่ต้องการ
การตั้งค่าเสียง
คุณควบคุมการตั้งค่าเสียงต่างๆ ได้ผ่าน Home API
เปิดหรือปิดไมโครโฟน
หากต้องการเปิดหรือปิดไมโครโฟนของอุปกรณ์ ให้อัปเดตแอตทริบิวต์
microphoneMuted
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setMicrophoneMuted ในตัว ดังนี้
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
เปิดหรือปิดการบันทึกเสียง
หากต้องการเปิดหรือปิดการบันทึกเสียงสำหรับอุปกรณ์ ให้อัปเดตแอตทริบิวต์
recordingMicrophoneMuted
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setRecordingMicrophoneMuted ในตัว
// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setRecordingMicrophoneMuted(!on)
}
} catch {
// Error
}
}
ปรับระดับเสียงของลำโพง
หากต้องการปรับระดับเสียงของลำโพงสำหรับอุปกรณ์ ให้อัปเดตแอตทริบิวต์
speakerVolumeLevel
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setSpeakerVolumeLevel ในตัว ดังนี้
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
การตั้งค่าโซนตรวจจับกิจกรรม
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
ZoneManagement ลักษณะช่วยให้อินเทอร์เฟซสำหรับจัดการภูมิภาคที่กำหนดเอง
ที่สนใจ (โซนตรวจจับกิจกรรม) ในอุปกรณ์กล้องและกริ่งประตู
ระบบจะใช้โซนเหล่านี้เพื่อกรองการตรวจหาเหตุการณ์ (เช่น การเคลื่อนไหวของบุคคล
หรือยานพาหนะ) ไปยังพื้นที่ที่เฉพาะเจาะจงภายในขอบเขตการมองเห็นของอุปกรณ์
ผู้ใช้จะกำหนดค่าโซนตรวจจับกิจกรรมได้ภายในแอปพลิเคชันพาร์ทเนอร์ ซึ่งจะช่วยให้ผู้ใช้สามารถวาดโซนเหนือพื้นที่ที่เฉพาะเจาะจงในขอบเขตการมองเห็นของกล้อง จากนั้นระบบจะแปลโซนที่ผู้ใช้กำหนดเหล่านี้เป็นโครงสร้างที่ลักษณะนี้ใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโซนตรวจจับกิจกรรมได้ที่ ตั้งค่าและใช้โซนตรวจจับกิจกรรม
โดยปกติแล้ว โซนตรวจจับกิจกรรมจะกำหนดโดยใช้พิกัดคาร์ทีเซียน 2 มิติ
ลักษณะนี้ระบุ
TwoDCartesianVertexStructสำหรับจุดยอดและ
TwoDCartesianZoneStruct
สำหรับการกำหนดโซน (ชื่อ จุดยอด สี และการใช้งาน)
ตรวจสอบโซนตรวจจับกิจกรรม
หากต้องการแสดงโซนตรวจจับกิจกรรม ให้ตรวจสอบแอตทริบิวต์
zones
ของลักษณะZoneManagement
let zoneManagementTrait: Google.ZoneManagementTrait self.zones = zoneManagementTrait.attributes.zones ?? []
เพิ่มโซนตรวจจับกิจกรรม
หากต้องการสร้างโซนใหม่ ให้ใช้คำสั่ง
createTwoDCartesianZone คำสั่งนี้ใช้ TwoDCartesianZoneStruct
ซึ่งกำหนดชื่อ จุดยอด สี และการใช้งานของโซน
ตัวอย่างต่อไปนี้แสดงวิธีสร้างโซนชื่อ "Front Porch" ที่มีจุดยอด 4 จุด สีแซลมอน (#F439A0) และใช้สำหรับการตรวจจับการเคลื่อนไหว
import GoogleHomeSDK import GoogleHomeTypes func createFrontPorchZone(trait: Google.ZoneManagementTrait) async { // 1. Define the vertices for the zone (2D Cartesian coordinates) // Values are UInt16, typically scaled to the device's twoDCartesianMax. let vertices = [ Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 260, y = 422), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1049, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 0), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 2048, y = 950), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 1630, y = 1349), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 880, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 0, y = 2048), Google.ZoneManagementTrait.TwoDCartesianVertexStruct(x = 638, y = 1090) ] // 2. Define the zone structure using the given SDK struct let newZone = Google.ZoneManagementTrait.TwoDCartesianZoneStruct( name: "Front Porch", use: [.motion], // ZoneUseEnum.motion vertices: vertices, // Color is a hex string (for example, Salmon/Pink) color: "#F439A0" ) do { // 3. Execute the raw command to add the zone to the device // This returns the created zone's ID (UInt16). var newZoneID = try await trait.createTwoDCartesianZone(zone: newZone) } catch { // Error } }
อัปเดตโซนตรวจจับกิจกรรม
หากต้องการอัปเดตโซนที่มีอยู่ ให้ใช้คำสั่ง
updateTwoDCartesianZone คำสั่งนี้ต้องใช้ zoneId และ TwoDCartesianZoneStruct ที่อัปเดตแล้ว
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 let zone: Google.ZoneManagementTrait.TwoDCartesianZoneStruct do { _ = try await zoneManagementTrait.updateTwoDCartesianZone( zoneID: zoneID, zone: zone) } catch { // Error }
ลบโซนตรวจจับกิจกรรม
หากต้องการนำโซนออก ให้ใช้คำสั่ง
removeZone กับ zoneId ที่เฉพาะเจาะจง
let zoneManagementTrait: Google.ZoneManagementTrait let zoneID: UInt16 do { _ = try await zoneManagementTrait.removeZone(zoneID: zoneID) } catch { // Error }
ทริกเกอร์เหตุการณ์ที่มีเสียง
AvStreamAnalysis ลักษณะนี้มีอินเทอร์เฟซสำหรับการจัดการทริกเกอร์การตรวจจับเหตุการณ์
ในอุปกรณ์กล้องและกริ่งประตู แม้ว่าทริกเกอร์ที่อิงตามวิสัยทัศน์
(เช่น ผู้คนหรือยานพาหนะ) จะเฉพาะเจาะจงโซนได้ แต่โดยทั่วไปแล้วทริกเกอร์ที่เกี่ยวข้องกับเสียง
จะเป็นการกำหนดค่าระดับอุปกรณ์
ทริกเกอร์ประเภทต่อไปนี้ใช้ได้กับการตรวจจับเสียงด้วย
EventTriggerTypeEnum
| โหมด | ค่า enum | คำอธิบาย |
|---|---|---|
| เสียง | Sound |
การตรวจจับเสียงทั่วไป |
| คนพูดคุย | PersonTalking |
ตรวจจับคำพูด |
| เสียงสุนัขเห่า | DogBark |
ตรวจจับเสียงร้องของสุนัข |
| กระจกแตก | GlassBreak |
ตรวจจับเสียงกระจกแตก |
| สัญญาณเตือนควัน | SmokeAlarm |
ตรวจจับสัญญาณเตือนควัน ซึ่งมักจะจดจำได้จากรูปแบบเสียงที่ได้ยิน T3 (เสียงบี๊บสั้นๆ 3 ครั้งแล้วหยุด) |
| สัญญาณเตือนคาร์บอนมอนอกไซด์ | CoAlarm |
ตรวจจับเสียงเตือนคาร์บอนมอนอกไซด์ (CO) ซึ่งโดยปกติจะ สังเกตได้จากรูปแบบเสียงที่ได้ยินของ T4 (เสียงบี๊บสั้นๆ 4 ครั้ง ตามด้วยการหยุดชั่วคราว) |
ตรวจสอบสถานะการตรวจจับเสียง
หากต้องการแสดงสถานะปัจจุบันของการตรวจจับเสียงต่อผู้ใช้ คุณต้องตรวจสอบ สิ่งที่อุปกรณ์รองรับและสิ่งที่ฮาร์ดแวร์ของอุปกรณ์เปิดใช้ แอตทริบิวต์ 2 รายการที่ต้องตรวจสอบมีดังนี้
ในการพัฒนา iOS โดยปกติแล้วคุณจะเข้าถึงAvStreamAnalysisลักษณะ
จากอุปกรณ์เพื่ออ่านแอตทริบิวต์เหล่านี้
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let possibleEventTriggers = avStreamAnalysisTrait.attributes.supportedEventTriggers ?? [] let enabledEventTriggers = avStreamAnalysisTrait.attributes.enabledEventTriggers ?? [] let eventTriggers [EventTrigger] = [] for trigger in possibleEventTriggers { self.eventTriggers.append( EventTrigger( id: trigger, enabled: enabledEventTriggers.contains(trigger) ) ) }
อัปเดตชุดทริกเกอร์ที่เปิดใช้
หากต้องการอัปเดตชุดทริกเกอร์ที่เปิดใช้ ให้ใช้คำสั่ง
SetOrUpdateEventDetectionTriggers
ซึ่งรับรายการโครงสร้าง EventTriggerEnablement
// Example struct to store event triggers public struct EventTrigger: Equatable { public var id: Google.AvStreamAnalysisTrait.EventTriggerTypeEnum public var enabled: Bool } let avStreamAnalysisTrait: Google.AvStreamAnalysisTrait let eventTriggers: [EventTrigger] let enabledEventTriggers = eventTriggers.map { Google.AvStreamAnalysisTrait.EventTriggerEnablement( eventTriggerType: $0.id, enablementStatus: $0.enabled ? .enabled : .disabled ) } try await avStreamAnalysisTrait.setOrUpdateEventDetectionTriggers( eventTriggerEnablements: enabledEventTriggers )
โหมดการบันทึก
ติดตั้งใช้งานในแอปตัวอย่างสำหรับ iOS
คุณลักษณะ RecordingMode มีอินเทอร์เฟซสำหรับจัดการลักษณะการทำงานของการบันทึกวิดีโอ
และรูปภาพในอุปกรณ์กล้องและกริ่งประตู ซึ่งช่วยให้
ผู้ใช้เลือกระหว่างการบันทึกอย่างต่อเนื่อง การบันทึกตามเหตุการณ์
หรือปิดใช้การบันทึกทั้งหมด (เฉพาะมุมมองสด)
RecordingModeEnum
กำหนดกลยุทธ์การบันทึกที่ใช้ได้ ดังนี้
| โหมด | ค่า enum | คำอธิบาย |
|---|---|---|
| ปิดใช้แล้ว | Disabled |
ปิดใช้การบันทึกโดยสมบูรณ์ อุปกรณ์รุ่นเดิมใช้เป็นหลัก |
| CVR (การบันทึกวิดีโอต่อเนื่อง) | Cvr |
บันทึกวิดีโอทุกวันตลอด 24 ชั่วโมง ต้องสมัครใช้บริการ (เช่น Google Home Premium |
| EBR (การบันทึกเมื่อเกิดเหตุการณ์) | Ebr |
การบันทึกจะเริ่มขึ้นเมื่อเกิดเหตุการณ์ (บุคคล การเคลื่อนไหว) ความยาวของวิดีโอจะขึ้นอยู่กับระยะเวลาของกิจกรรมและการสมัครใช้บริการ |
| ETR (การบันทึกเมื่อเกิดเหตุการณ์) | Etr |
การบันทึกตัวอย่าง Shorts (เช่น 10 วินาที) ที่ทริกเกอร์โดยเหตุการณ์ |
| ดูภาพสด | LiveView |
ระบบจะปิดใช้การบันทึก แต่ผู้ใช้จะยังเข้าถึงไลฟ์สดได้ |
| ภาพนิ่ง | Images |
ระบบจะบันทึกสแนปชอตแทนวิดีโอเมื่อเกิดเหตุการณ์ |
ตรวจสอบโหมดการบันทึก
หากต้องการแสดงการกำหนดค่าการบันทึกปัจจุบัน ให้ตรวจสอบแอตทริบิวต์
ของลักษณะRecordingMode
supportedRecordingModes- โหมดที่เป็นไปได้ทั้งหมดavailableRecordingModes- โหมดที่เลือกได้selectedRecordingMode- โหมดแอ็กทีฟ
// Example struct to store recording modes. public struct RecordingMode: Hashable { public let id: UInt8 public let mode: Google.RecordingModeTrait.RecordingModeEnum } let recordingModeTrait: Google.RecordingModeTrait if let availableRecordingModes = recordingModeTrait.attributes.availableRecordingModes, let supportedRecordingModes = recordingModeTrait.attributes.supportedRecordingModes, let selectedRecordingMode = recordingModeTrait.attributes.selectedRecordingMode { var recordingModes: [RecordingMode] = [] for recordingModeId in availableRecordingModes { guard Int(recordingModeId) < supportedRecordingModes.count, Int(recordingModeId) >= 0 else { // Out of bounds error } recordingModes.append( RecordingMode( id: recordingModeId, mode: supportedRecordingModes[Int(recordingModeId)].recordingMode, ) ) } }
เปลี่ยนโหมดการบันทึก
ก่อนอัปเดต โปรดตรวจสอบว่าดัชนีที่เลือกจากแอตทริบิวต์ supportedRecordingModes
อยู่ในแอตทริบิวต์ availableRecordingModes
หากต้องการอัปเดตโหมดที่เลือก ให้ใช้ฟังก์ชัน setSelectedRecordingMode โดยส่งดัชนีของโหมดที่เลือก
let recordingModeTrait: Google.RecordingModeTrait let recordingModeID: UInt8 _ = try await recordingModeTrait.update { $0.setSelectedRecordingMode(recordingModeID) }
การตั้งค่าอื่นๆ
คุณควบคุมการตั้งค่าอื่นๆ ได้ผ่าน Home API
เปลี่ยนการวางแนวรูปภาพ
คุณหมุนการวางแนวของรูปภาพ (วิดีโอ) จากกล้องได้ หมุนวิดีโอได้ 180 องศาเท่านั้น
หากต้องการเปลี่ยนการวางแนวรูปภาพของกล้อง ให้อัปเดตแอตทริบิวต์
imageRotation
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setImageRotation ในตัว ดังนี้
// Change the camera's image orientation
// Value must be 0 or 180
func setImageRotation(to value: UInt16) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setImageRotation(value)
}
} catch {
// Error
}
}
เปิดหรือปิดฟีเจอร์ภาพกลางคืน
หากต้องการเปิดหรือปิดการมองเห็นตอนกลางคืนสำหรับกล้อง ให้ใช้ TriStateAutoEnum
เพื่ออัปเดตแอตทริบิวต์
nightVision
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setNightVision ในตัว
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
เปลี่ยนความสว่างของ LED แสดงสถานะ
หากต้องการเปลี่ยนความสว่างของไฟ LED แสดงสถานะ ให้ใช้
ThreeLevelAutoEnum
เพื่ออัปเดตแอตทริบิวต์
statusLightBrightness
ของลักษณะ CameraAvStreamManagementTrait โดยใช้ฟังก์ชัน setStatusLightBrightness ในตัว ดังนี้
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
เปลี่ยนวิวพอร์ตของกล้อง
ช่องมองภาพของกล้องจะเหมือนกับฟีเจอร์ซูมและครอบตัดที่อธิบายไว้ในบทความสนับสนุนซูมและปรับปรุงวิดีโอของกล้อง Nest
วิวพอร์ตกำหนดไว้ใน ViewportStruct ซึ่งมีค่า 4 ค่าที่ใช้เป็นพิกัดของวิวพอร์ต โดยพิกัดจะกําหนดดังนี้
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
การกำหนดค่าสำหรับ ViewportStruct ขึ้นอยู่กับ UI ของแอปและการติดตั้งใช้งานกล้อง
ในระดับพื้นฐานมากที่สุด หากต้องการตั้งค่า Viewport ของวิดีโอ
กล้อง ให้อัปเดตแอตทริบิวต์
viewport
ของลักษณะ CameraAvStreamManagementTrait ด้วย ViewportStruct โดยใช้
ฟังก์ชัน setViewport ในตัว
func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {
let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
x1: x1,
y1: y1,
x2: x2,
y2: y2
)
Task {
do {
try await cameraAvStreamManagementTrait.update {
$0.setViewport(viewport)
}
} catch {
// Error
}
}
}
สร้าง TransportOptionsStruct
การตั้งค่าบางอย่างต้องมีการแก้ไขพร็อพเพอร์ตี้ใน TransportOptionsStruct,
ซึ่งจะส่งไปยังตัวเลือกการรับส่งของการเชื่อมต่อการสตรีม สำหรับ
Swift คุณต้องสร้างโครงสร้างนี้ก่อนอัปเดตพร็อพเพอร์ตี้
ใช้ฟังก์ชันช่วยนี้เพื่อสร้างโครงสร้างสำหรับใช้กับการเปลี่ยนแปลงการตั้งค่าต่อไปนี้
func getTransportOptions(
transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
wakeUpSensitivity: UInt8?,
maxEventLength: UInt32?
) async throws
-> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{
var newMotionTimeControl:
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
if let maxEventLength {
guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
throw HomeError.failedPrecondition(
// Error - cannot update max event length without motion time control
}
newMotionTimeControl =
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
initialDuration: motionTimeControl.initialDuration,
augmentationDuration: motionTimeControl.augmentationDuration,
maxDuration: maxEventLength,
blindDuration: motionTimeControl.blindDuration
)
}
return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
streamUsage: .recording,
videoStreamID: nil,
audioStreamID: nil,
tlsEndpointID: transportOptions.tlsEndpointID,
url: transportOptions.url,
triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
triggerType: .motion,
motionZones: nil,
motionSensitivity: wakeUpSensitivity,
motionTimeControl: newMotionTimeControl,
maxPreRollLen: nil
),
ingestMethod: .cmafIngest,
containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
containerType: .cmaf,
cmafContainerOptions: nil
),
expiryTime: nil
)
}
private func getRecordingConnection() async throws
-> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
guard let pushAvStreamTransportTrait else {
// Error - PushAvStreamTransport trait not available
return nil
}
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations
for connection in connections {
guard let transportOptions = connection.transportOptions,
transportOptions.streamUsage == .recording
else {
continue
}
return connection
}
return nil
}
เปิดหรือปิดใช้ข้อมูลวิเคราะห์
อุปกรณ์แต่ละเครื่องอาจเลือกที่จะส่งข้อมูลวิเคราะห์แบบละเอียดไปยัง ระบบคลาวด์ของ Google Home (ดูการตรวจสอบระบบคลาวด์สำหรับ Home API)
หากต้องการเปิดใช้ข้อมูลวิเคราะห์สำหรับอุปกรณ์ ให้ตั้งค่าพร็อพเพอร์ตี้
analyticsEnabled
ของ
ExtendedGeneralDiagnosticsTrait
เป็น true เมื่อตั้งค่า analyticsEnabled
พร็อพเพอร์ตี้อื่น logUploadEnabled จะได้รับการตั้งค่าเป็น true โดยอัตโนมัติ ซึ่ง
จะอนุญาตให้อัปโหลดไฟล์บันทึกการวิเคราะห์ไปยังระบบคลาวด์ของ Google Home
// Enable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(true)
}
// Disable analytics
_ = try await extendedGeneralDiagnosticsTrait.update {
$0.setAnalyticsEnabled(false)
}
การกำหนดค่าการขนส่งและการบันทึก
ส่วนนี้ครอบคลุมการตั้งค่าที่เกี่ยวข้องกับคุณภาพการสตรีมของกล้องและ
การทริกเกอร์เหตุการณ์ การตั้งค่าเหล่านี้ได้รับการจัดการโดยลักษณะภาษา
PushAvStreamTransport
อ่านการตั้งค่าการรับส่ง
ส่วนนี้จะสาธิตวิธีดึงข้อมูลการกำหนดค่าปัจจุบันจาก
อุปกรณ์กล้องหรือกริ่งประตู โดยจะดึงข้อมูลลักษณะ PushAvStreamTransport
ค้นหาการเชื่อมต่อที่เฉพาะเจาะจงซึ่งใช้สำหรับการบันทึก แล้วแยกค่าปัจจุบัน
สำหรับคุณภาพแบนด์วิดท์ ความไวในการปลุกระบบ
และระยะเวลาสูงสุดของเหตุการณ์
// Assuming access to // var pushAvStreamTransportTrait: Google.PushAvStreamTransportTrait let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations // Locate the connection designated for recording let recordingConnection = connections.first { connection in guard let transportOptions = connection.transportOptions else { return false } return transportOptions.streamUsage == .recording } let options = recordingConnection?.transportOptions // 1. Bandwidth Quality (Video Stream ID) let videoStreamId = options?.videoStreamID // 2. Wake-up Sensitivity (Motion Sensitivity) let wakeUpSensitivity = options?.triggerOptions.motionSensitivity // 3. Max Event Length (Motion Trigger Time Control) let maxEventLength = options?.triggerOptions.motionTimeControl?.maxDuration
อัปเดตการตั้งค่าการรับส่ง
ส่วนนี้จะแสดงวิธีเปลี่ยนการตั้งค่าการขนส่ง
โดยจะสร้าง TransportOptionsStruct ใหม่ที่มีค่าใหม่ แล้วใช้คำสั่ง modifyPushTransport เพื่อส่งการตั้งค่าที่อัปเดตแล้วเหล่านี้กลับไปยังอุปกรณ์ และใช้การตั้งค่าดังกล่าวกับการเชื่อมต่อการบันทึกที่พบในขั้นตอนก่อนหน้า
หากต้องการแก้ไขการตั้งค่าเหล่านี้ ให้ใช้คำสั่ง modifyPushTransport
กับ TransportOptionsStruct
// Example: Updating to Max Quality and 30s duration let currentOptions = recordingConnection!.transportOptions! let newOptions = Google.PushAvStreamTransportTrait.TransportOptionsStruct( streamUsage: .recording, videoStreamID: 2, // Max Quality tlsEndpointID: currentOptions.tlsEndpointID, url: currentOptions.url, triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct( triggerType: .motion, motionSensitivity: 5, // Medium motionTimeControl: Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct( initialDuration: currentOptions.triggerOptions.motionTimeControl?.initialDuration ?? 10, augmentationDuration: currentOptions.triggerOptions.motionTimeControl?.augmentationDuration ?? 5, maxDuration: 30, blindDuration: currentOptions.triggerOptions.motionTimeControl?.blindDuration ?? 0 ) ), ingestMethod: currentOptions.ingestMethod, containerOptions: currentOptions.containerOptions ) try await pushAvStreamTransportTrait.modifyPushTransport( connectionID: recordingConnection!.connectionID, transportOptions: newOptions )
พิจารณาคุณภาพแบนด์วิดท์
พร็อพเพอร์ตี้ videoStreamId
ของ TransportOptionsStruct สอดคล้องกับการกำหนดค่าสตรีมวิดีโอ
ที่เฉพาะเจาะจง
หากต้องการดูสตรีมวิดีโอที่รองรับ ให้ดูแอตทริบิวต์
allocatedVideoStreams
ซึ่งเป็นรายการของ VideoStreamStructs
จากลักษณะ CameraAvStreamManagement ของอุปกรณ์
ปรับความไวในการปลุกระบบของอุปกรณ์
พร็อพเพอร์ตี้ motionSensitivity
ของ TransportTriggerOptionsStruct สอดคล้องกับค่าต่อไปนี้
| ป้ายกำกับ | ค่า (UInt8) |
|---|---|
| ต่ำ | 1 |
| ปานกลาง | 5 |
| สูง | 10 |
ปรับระยะเวลาสูงสุดของเหตุการณ์
พร็อพเพอร์ตี้ maxDuration
ของ TransportMotionTriggerTimeControlStruct
สอดคล้องกับระยะเวลา UInt32 ต่อไปนี้ (เป็นวินาที)
- 10, 15, 30, 60, 120, 180