十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Matter Camera AV Stream Management Cluster 服务端实现集成指南:基于 connectedhomeip 的代码驱动架构解析

Matter Camera AV Stream Management Cluster 服务端实现集成指南:基于 connectedhomeip 的代码驱动架构解析 Matter Camera AV Stream Management Cluster 服务端实现集成指南基于 connectedhomeip 的代码驱动架构解析【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip导读本文围绕 connectedhomeip 仓库中 Camera AV Stream Management相机音视频流管理集群的服务端实现展开完整讲解其代码驱动code-driven架构、核心组件职责以及将集群集成进自有 Matter 设备应用的全流程。读完本文你将掌握如何实现CameraAVStreamManagementDelegate、如何构造并注册CameraAVStreamManagementCluster实例、如何配置 Features 与可选属性位以及Init()阶段会执行哪些配置合法性校验从而在自己的相机产品中落地按需分配、复用与释放视频/音频/快照流的能力。Camera AV Stream Management 集群解决什么问题Camera AV Stream Management下文简称 AVSM集群负责管理相机设备上音频流、视频流与快照流的分配、配置和生命周期。它允许 Matter 网络中的 Commissioner 根据实际用途如实时查看 Live View、录像 Recording、分析 Analysis 等向相机请求分配媒体流同时让设备侧能够按自身编码与流媒体资源状况进行约束和调配。在 README 中明确强调了一个关键架构决策该目录下的实现是代码驱动的核心逻辑不依赖 ZAP 工具的代码生成应用也不应使用 ZAP 工具来配置其属性和命令。这意味着该集群不走传统的zap配置 代码生成路线而是像 src/app/server-cluster 体系中的其它ServerCluster一样由应用在运行时显式创建实例、注入配置并注册到数据模型注册表。这也是理解整个集成流程的前提。两大核心组件1.CameraAVStreamManagementCluster集群逻辑主体类定义位于 CameraAVStreamManagementCluster.h它继承自DefaultServerCluster承担四类职责属性存储保存只读能力属性如最大并发编码器、最大编码像素率、视频传感器参数等与可写运行状态属性如 HDR 开关、隐私模式、夜视、Viewport、扬声器/麦克风状态、图像旋转等并提供成对的 Getter/Setter 方法命令处理实现InvokeCommand分派 Video/Audio/Snapshot 流的 Allocate/Modify/Deallocate、SetStreamPriorities、CaptureSnapshot 等命令数据模型接入通过ReadAttribute/WriteAttribute/Attributes/AcceptedCommands/GeneratedCommands与交互模型Interaction Model对接流资源管理内部维护mAllocatedVideoStreams、mAllocatedAudioStreams、mAllocatedSnapshotStreams三类已分配流列表以及mSupportedStreamUsages、mStreamUsagePriorities等策略数据并提供AddVideoStream/RemoveVideoStream、引用计数更新等一系列管理函数。从源码可见集群还支持**流复用reuse**逻辑GetReusableVideoStreamId与GetReusableSnapshotStreamId会在收到分配请求时遍历已分配流检查请求参数是否落在某个已分配流的参数区间内若命中则直接复用该流而非新建从而节约编码器资源。2.CameraAVStreamManagementDelegate应用必须实现的中介接口CameraAVStreamManagementDelegate是一个纯虚接口同见 CameraAVStreamManagementCluster.h它是集群逻辑与设备底层相机/音频/编码器软硬件栈之间的桥梁。集群本身不直接操作硬件所有真正去分配编码器、真正去启动流的动作都委托给应用实现的 Delegate。Delegate 需要实现的纯虚方法可分为以下几组分组方法说明视频流VideoStreamAllocate/VideoStreamModify/VideoStreamDeallocate按参数分配/修改/释放视频流VideoStreamAllocate会通过outStreamID输出分配结果视频流OnVideoStreamAllocated服务端完成参数收敛后回调用于按最终参数真正启动流action参数StreamAllocationAction标明是新分配、参数修改若活跃需重启还是直接复用音频流AudioStreamAllocate/AudioStreamDeallocate音频流分配与释放快照流SnapshotStreamAllocate/SnapshotStreamModify/SnapshotStreamDeallocate快照流分配/修改/释放分配入参使用专门的SnapshotStreamAllocateArgs结构体快照抓取CaptureSnapshot抓取单帧图像通过ImageSnapshot输出图像数据、分辨率与编码格式策略与状态OnStreamUsagePrioritiesChanged/OnAttributeChanged流使用优先级或属性变化时的通知回调持久化PersistentAttributesLoadedCallback集群从 KVS 持久化存储加载完属性后的回调只读查询GetAllocatedVideoStreams/GetAllocatedAudioStreams供其它组件如PushAVStreamTransportManager只读查询已分配流参数例如用于带宽计算需要注意的约束VideoStreamStruct与AudioStreamStruct入参中的videoStreamID/audioStreamID与referenceCount字段必须被 Delegate 忽略StreamID 由 Delegate 负责生成并通过出参返回。从零集成六个步骤以 camera-app 为例README 推荐的集成范本是 examples/camera-app/camera-common/src/camera-app.cpp 中的CreateAndInitializeCameraAVStreamMgmt()与InitializeCameraAVStreamMgmt()。下面按 README 的六个步骤逐层展开。步骤 1实现 Delegate创建一个继承CameraAVStreamManagementDelegate的具体类实现上述全部纯虚方法将集群逻辑与设备自有媒体管线对接。可参考测试代码中的MockCameraAVStreamManagementDelegate见 tests/TestCameraAVStreamManagementCluster.cpp——它演示了 Delegate 内如何校验码型/采样率/位深是否在能力范围内、如何维护内部流计数并返回Status::ResourceExhausted/Status::DynamicConstraintError/Status::Success。步骤 2确定 Features 与可选属性基于设备实际能力填充BitFlagsCameraAvStreamManagement::Feature与BitFlagsCameraAvStreamManagement::OptionalAttribute。在 camera-app 示例中这些位完全由CameraHALInterface的查询结果驱动avsmFeatures.Set(CameraAvStreamManagement::Feature::kSnapshot); avsmFeatures.Set(CameraAvStreamManagement::Feature::kVideo); // 相机支持水印/OSD/软隐私/音频/本地存储/扬声器/HDR/夜视时逐项 Set... if (mCameraDevice-GetCameraHALInterface().GetCameraSupportsHDR()) { avsmFeatures.Set(CameraAvStreamManagement::Feature::kHighDynamicRange); } if (mCameraDevice-GetCameraHALInterface().HasHardPrivacySwitch()) { avsmOptionalAttrs.Set(CameraAvStreamManagement::OptionalAttribute::kHardPrivacyModeOn); }Feature 位定义位于 Enums.hFeature位值含义kAudio0x1支持音频流kVideo0x2支持视频流kSnapshot0x4支持快照流kPrivacy0x8支持隐私模式kSpeaker0x10支持扬声器kImageControl0x20支持图像控制翻转/旋转kWatermark0x40支持水印kOnScreenDisplay0x80支持屏幕叠加显示OSDkLocalStorage0x100支持本地存储kHighDynamicRange0x200支持 HDRkNightVision0x400支持夜视OptionalAttribute位定义同样在 CameraAVStreamManagementCluster.h 中包括kHardPrivacyModeOn、kNightVisionIllum、kMicrophoneAGCEnabled、kImageRotation、kImageFlipHorizontal、kImageFlipVertical、kStatusLightEnabled、kStatusLightBrightness。步骤 3收集全部构造参数InitArguments集群构造函数的入参统一封装在CameraAVStreamManagementCluster::InitArguments结构体中见 CameraAVStreamManagementCluster.h。README 列出的参数在源码中对应如下字段参数类型含义与来源建议delegate引用Delegate 实例调用方必须保证其生命周期长于集群实例endpointIdEndpointId集群所在端点须与 zap 配置一致featuresBitFlagsFeature支持的特性位optionalAttrsBitFlagsOptionalAttribute支持的可选属性位maxConcurrentEncodersuint8_t相机支持的最大并发编码器数maxEncodedPixelRateuint32_t相机支持的最大编码像素率像素/秒videoSensorParamsVideoSensorParamsStruct视频传感器参数宽、高、最大帧率等nightVisionUsesInfraredbool夜视模式是否使用红外minViewPortVideoResolutionStruct相机视口允许的最小分辨率rateDistortionTradeOffPointsstd::vectorRateDistortionTradeOffStruct硬件编码器支持的率失真折衷点码率档位maxContentBufferSizeuint32_t含 pre-roll 在内的所有流内容缓冲最大字节数microphoneCapabilities/spkrCapabilitiesAudioCapabilitiesStruct麦克风/扬声器的音频能力支持的编解码、采样率、声道数、位深twoWayTalkSupportTwoWayTalkSupportTypeEnum双向通话支持类型半双工/全双工/不支持snapshotCapabilitiesstd::vectorSnapshotCapabilitiesStruct支持的快照能力图像编解码、分辨率、最大帧率等maxNetworkBandwidthuint32_t媒体流传输消耗的最大网络带宽bpssupportedStreamUsagesstd::vectorStreamUsageEnum设备可提供的流用途集合streamUsagePrioritiesstd::vectorStreamUsageEnum可用流的优先级排序这些值应一律取自设备硬件抽象层。示例代码中的赋值可参考 camera-app.cpp例如maxNetworkBandwidth取自 HAL 并乘以kBitsPerMegabit1000000换算为 bpstwoWayTalkSupport由同时具备麦克风和扬声器推导为kFullDuplex否则为kNotSupported。测试代码 TestCameraAVStreamManagementCluster.cpp 提供了典型取值参考maxConcurrentEncoders 1、maxEncodedPixelRate 248832000即 1920×1080×120、minViewPort {640, 480}、maxContentBufferSize 4096、maxNetworkBandwidth 128000000等。步骤 4创建集群实例并注册示例使用ServerClusterCameraAVStreamManagementCluster成员变量配合Create方法在堆上/成员中实例化集群再注册到数据模型注册表mAVStreamMgmtServer.Create(std::move(args)); CHIP_ERROR err CodegenDataModelProvider::Instance().Registry().Register(mAVStreamMgmtServer.Registration());Registry().Register()将集群注册到指定端点若失败会打印形如Failed to register CameraAVStreamManagementServer on endpoint %u的错误日志见 camera-app.cpp。注意先注册再 Init的顺序注册发生在CreateAndInitializeCameraAVStreamMgmt()中随后才调用初始化函数。步骤 5设置可写属性的初始值注册完成后基于设备当前状态为可写属性设置初始值即调用集群的 Setter 方法。在 InitializeCameraAVStreamMgmt 中可以看到一整套按能力门控的初始赋值支持 HDR 时SetHDRModeEnabled(hal.GetHDRMode())支持软隐私时SetSoftRecordingPrivacyModeEnabled/SetSoftLivestreamPrivacyModeEnabled有硬件隐私开关时SetHardPrivacyModeOn(hal.GetHardPrivacyMode())支持夜视时SetNightVision(...)始终SetViewport(hal.GetViewport())有扬声器/麦克风时SetSpeakerMuted/SetSpeakerVolumeLevel/SetSpeakerMaxLevel/SetSpeakerMinLevel以及麦克风对应的一组方法有本地存储时SetLocalVideoRecordingEnabled/SetLocalSnapshotRecordingEnabled有状态灯时SetStatusLightEnabled支持图像控制时SetImageRotation/SetImageFlipVertical/SetImageFlipHorizontal。从源码可以看出这些 Setter 都会走SetAttributeIfDifferent模板仅当值发生变化时才写入、触发持久化mContext-attributeStorage.WriteValue、回调mDelegate.OnAttributeChanged(attributeId)并向订阅者广播NotifyAttributeChanged见 CameraAVStreamManagementCluster.h避免无意义的写入与通知。步骤 6调用Init()最后调用集群实例的Init()方法它会对配置做强制合法性校验返回CHIP_ERROR_INVALID_ARGUMENT或CHIP_NO_ERROR。校验规则可从 CameraAVStreamManagementCluster.cpp 归纳为每个RateDistortionTradeOffPoints的minBitRate必须 ≥ 1至少支持 Audio、Video、Snapshot 中的一个 Feature交叉依赖校验启用kImageControl/kWatermark/kOnScreenDisplay/kHighDynamicRange时必须同时启用kVideo或kSnapshot启用kSpeaker时必须启用kAudio可选属性位与 Feature 的对应关系kNightVisionIllum需要kNightVisionkMicrophoneAGCEnabled需要kAudio图像翻转/旋转属性需要kImageControl反过来若启用kImageControl特性则必须至少支持一个图像翻转/旋转属性校验通过且集群上下文已就绪IsStarted()时调用LoadPersistentAttributes()从 KVS 加载持久化属性如 Viewport、StreamUsagePriorities、已分配流列表。Init 完成后集群即可以响应交互模型的属性读写与命令调用。集群头文件对Init()的语义说明是如果给定端点与集群 ID 未在 zap 中启用或 CommandHandler/AttributeHandler 注册失败均返回错误见 CameraAVStreamManagementCluster.h。目录结构与构建集成该集群的完整源文件布局如下CameraAVStreamManagementCluster.cpp / .h集群主体MigrationCameraAVStreamManagementCluster.cpp / .h、MigratorCameraAVStreamManagementStorage.cpp / .h属性持久化存储的迁移辅助实现tests/TestCameraAVStreamManagementCluster.cpp单元测试含MockCameraAVStreamManagementDelegate与MakeInitArguments构造辅助BUILD.gnGN 构建目标定义。构建层面source_set(camera-av-stream-management-server)包含上述源码并依赖src/app/persistence:migration、src/lib/core、src/lib/support其公开依赖链挂接到src/app、src/app/data-model-provider、src/app/persistence、src/app/server-cluster以及 zzz_generated 中生成的CameraAvStreamManagement集群数据属性/命令定义。对于使用 CMake 构建的嵌入式平台另有 app_config_dependent_sources.cmake 与 app_config_dependent_sources.gni 用于按应用配置裁剪源文件。与周边相机集群的协同在 camera-app 的完整初始化流程 InitCameraDeviceClusters 中可以看到AVSM 集群并非孤立存在它通常与以下集群/模块协同工作PushAvStreamTransport推送式音视频流传输集群其 Delegate 在 AVSM 初始化之后才被设置注释明确Only init PushAV once AVSM is initWebRTCTransportProviderWebRTC 传输提供方媒体流可经其分发CameraAVSettingsUserLevelMgmt / ZoneManagement / Chime / AVAnalysis相机设置、区域管理、提示音与分析等配套集群。AVSM 的 Delegate 通过GetAllocatedVideoStreams/GetAllocatedAudioStreams对外暴露已分配流信息正是为了供 PushAVStreamTransport 等下游组件做带宽估算体现了集群间以 Delegate 为契约的解耦设计。深入验证单元测试如何印证行为若需验证自己对集群行为的理解可直接研读 tests/TestCameraAVStreamManagementCluster.cpp。该测试套件通过MakeInitArguments含全部 Feature 与可选属性位的典型组合构造集群并用MockCameraAVStreamManagementDelegate模拟硬件侧行为可观察到Delegate 对不支持码型/采样率/位深时返回DynamicConstraintError的拒绝路径流数量超限时返回ResourceExhausted的资源保护路径快照分配时依据SnapshotCapabilities校验imageCodec的流程集群Init()校验失败时返回CHIP_ERROR_INVALID_ARGUMENT的配置错误路径。测试文件还引入了MigrationCameraAVStreamManagementCluster说明持久化数据迁移逻辑同样被覆盖测试。总结Camera AV Stream Management 集群的 connectedhomeip 服务端实现采用完全代码驱动的模式CameraAVStreamManagementCluster负责数据模型接入、属性存储与命令分派CameraAVStreamManagementDelegate负责与设备媒体栈的真实交互。应用集成时只需遵循实现 Delegate → 收集能力参数 → 构造并注册集群 → 设置初始属性 → 调用 Init()的固定流程即可让相机设备支持被 Commissioner 按需分配、复用和释放视频/音频/快照流。若需进一步深入建议对照 CameraAVStreamManagementCluster.h 中的InitArguments字段注释、CameraAVStreamManagementCluster.cpp 中的校验逻辑以及 camera-app.cpp 的完整示例逐步验证。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表