媒体播放 Cluster(MediaPlayback)

Cluster ID: 0x0506  |  所在 Endpoint: 媒体端点(电视、音箱、机顶盒等)

MediaPlayback 是 Matter 中用于控制媒体播放的核心 Cluster。 它提供了播放、暂停、停止、快进、快退、跳转等标准媒体控制操作, 适用于电视、智能音箱、机顶盒、流媒体播放器等所有需要媒体播放能力的设备。 所有播放控制命令都会返回统一的 PlaybackResponse,包含操作结果状态码。

Feature 驱动的能力分级

MediaPlayback 通过 5 个 Feature 位控制不同能力等级。 基础设备(如简单音箱)只需支持 Play/Pause/Stop 等基本命令; 高级设备(如智能电视)可启用 AdvancedSeek(AS) 支持进度跳转, VariableSpeed(VS) 支持变速播放, TextTracks(TT) 和 AudioTracks(AT) 支持字幕和多音轨切换。

命令(Commands)

MediaPlayback Cluster 共有 14 个命令,覆盖从基础播控到高级跳转、音轨字幕切换等全部操作。 所有命令执行后都会返回 PlaybackResponse,包含 StatusEnum 状态码。 点击下方表格中的命令 ID 可跳转到对应的详细说明。

ID 名称 说明 所需特性
0x00 Play 开始或恢复播放 无
0x01 Pause 暂停播放 无
0x02 Stop 停止播放 无
0x03 StartOver 从头播放 无
0x04 Previous 上一曲/上一集 无
0x05 Next 下一曲/下一集 无
0x06 Rewind 快退 无
0x07 FastForward 快进 无
0x08 SkipForward 向前跳过指定时间 无
0x09 SkipBackward 向后跳过指定时间 无
0x0B Seek 跳转到指定位置 AS
0x0C ActivateAudioTrack 切换音轨 AT
0x0D ActivateTextTrack 开启/切换字幕 TT
0x0E DeactivateTextTrack 关闭字幕 TT

Play —— 播放(0x00)

开始或恢复媒体播放。执行成功后,CurrentState 属性变为 Playing (0)。如果当前已经在播放,命令仍然成功但不产生额外效果。 不需要参数。

使用场景

用户点击遥控器上的播放按钮、语音助手执行「播放」指令、暂停后恢复播放时调用。

Pause —— 暂停(0x01)

暂停当前播放。执行成功后,CurrentState 属性变为 Paused (1)。设备保留当前播放进度,可通过 Play 命令恢复。 不需要参数。

使用场景

用户按下暂停键、来电时自动暂停、语音助手执行「暂停」指令时调用。

Stop —— 停止(0x02)

停止媒体播放并释放播放资源。执行成功后,CurrentState 属性变为 NotPlaying (2)。与 Pause 不同,Stop 表示用户不打算继续观看当前内容。 不需要参数。

使用场景

用户退出当前播放内容、切换到其他 App、关闭播放器时调用。

StartOver —— 从头播放(0x03)

将当前播放内容的进度重置到起始位置,并开始播放。 不需要参数。

使用场景

用户想重新观看当前集、语音助手执行「重头播放」指令时调用。

Previous —— 上一个(0x04)

切换到播放列表中的上一个媒体项目(上一曲/上一集)。 如果已经是第一个项目,设备行为由实现决定(可能从头播放或忽略)。 不需要参数。

使用场景

用户按遥控器上一曲键、语音助手执行「上一首」指令时调用。

Next —— 下一个(0x05)

切换到播放列表中的下一个媒体项目(下一曲/下一集)。 如果已经是最后一个项目,设备行为由实现决定(可能停止播放或循环到第一项)。 不需要参数。

使用场景

用户按遥控器下一曲键、语音助手执行「下一首」指令时调用。

Rewind —— 快退(0x06)

开始快退播放。设备将以反向加速播放媒体内容。 如果设备支持 VariableSpeed(VS) 特性,连续多次调用可逐级增加快退速度 (如 -2x、-4x、-8x),PlaybackSpeed 会更新为负值。 不需要参数。

使用场景

用户长按遥控器快退键查找之前的画面,连续按可加速快退。

FastForward —— 快进(0x07)

开始快进播放。设备将以正向加速播放媒体内容。 如果设备支持 VariableSpeed(VS) 特性,连续多次调用可逐级增加快进速度 (如 2x、4x、8x),PlaybackSpeed 会更新为对应倍速。 不需要参数。

使用场景

用户长按遥控器快进键跳过广告或无聊片段,连续按可加速快进。

SkipForward —— 向前跳过(0x08)

从当前位置向前跳过指定的毫秒数。与 FastForward 的持续性不同,SkipForward 是一次性跳转。

参数类型说明
DeltaPositionMilliseconds uint64 向前跳过的毫秒数。例如 30000 = 向前跳 30 秒
使用场景

App 上的「跳过 30 秒」按钮、语音助手执行「快进 1 分钟」指令时调用。

SkipBackward —— 向后跳过(0x09)

从当前位置向后跳过指定的毫秒数。如果跳过量超过已播放时间,回到媒体起点。

参数类型说明
DeltaPositionMilliseconds uint64 向后跳过的毫秒数。例如 10000 = 向后跳 10 秒
使用场景

用户错过了一段对话,按「后退 10 秒」按钮回看。

Seek —— 跳转(0x0B)

跳转到媒体的指定绝对位置。需要设备支持 AdvancedSeek(AS) 特性。 跳转位置必须在 SeekRangeStart 和 SeekRangeEnd 之间, 超出范围会返回 SeekOutOfRange (5) 错误。

参数类型说明
Position uint64 目标位置(毫秒)。例如 600000 = 跳转到第 10 分钟
Seek 范围校验

在调用 Seek 之前,应先读取 SeekRangeStart 和 SeekRangeEnd 属性来确认可跳转范围。对于直播流,可跳转范围可能是一个滑动窗口(例如最近 2 小时), 超出窗口的位置将被拒绝。

使用场景

用户拖动进度条到指定位置、语音助手执行「跳到第 30 分钟」指令时调用。

ActivateAudioTrack —— 切换音轨(0x0C)

切换到指定的音轨。需要设备支持 AudioTracks(AT) 特性。 可用音轨列表通过 AvailableAudioTracks 属性获取。

参数类型说明
TrackID string 目标音轨 ID,来自 AvailableAudioTracks 列表
AudioOutputIndex uint8 音频输出索引(指定音轨输出到哪个音频输出端)
使用场景

用户在电视上切换电影的音轨语言,从英文原声切换到中文配音。

ActivateTextTrack —— 开启字幕(0x0D)

开启或切换到指定的字幕轨道。需要设备支持 TextTracks(TT) 特性。 可用字幕列表通过 AvailableTextTracks 属性获取。

参数类型说明
TrackID string 目标字幕轨道 ID,来自 AvailableTextTracks 列表
使用场景

用户打开中文字幕观看英文电影、切换到英文字幕练习听力时调用。

DeactivateTextTrack —— 关闭字幕(0x0E)

关闭当前显示的字幕。执行成功后,ActiveTextTrack 属性变为 null。 需要设备支持 TextTracks(TT) 特性。不需要参数。

使用场景

用户不想看字幕时关闭、语音助手执行「关闭字幕」指令时调用。

PlaybackResponse —— 命令响应

所有 14 个命令执行后都会返回此响应,包含操作结果状态码和可选数据。

字段类型说明
Status StatusEnum 命令执行结果。0 (Success) 表示成功
Data string / null 可选的附加数据,由设备实现决定内容

响应示例:

{
  "Status": 0,     // Success
  "Data": null      // 无附加数据
}

属性详解

MediaPlayback Cluster 共有 11 个应用属性,分为播放状态、时间信息、音轨与字幕三组。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。

ID 名称 类型 分组 说明
0x0000 CurrentState PlaybackStateEnum 播放状态 当前播放状态
0x0001 StartTime epoch_us / null 时间信息 媒体开始时间
0x0002 Duration uint64 / null 时间信息 媒体总时长(毫秒)
0x0003 SampledPosition PlaybackPositionStruct / null 时间信息 采样播放位置
0x0004 PlaybackSpeed single (float) 时间信息 当前播放速度
0x0005 SeekRangeEnd uint64 / null 时间信息 可跳转范围终点(毫秒)
0x0006 SeekRangeStart uint64 / null 时间信息 可跳转范围起点(毫秒)
0x0007 ActiveAudioTrack TrackStruct / null 音轨与字幕 当前音轨
0x0008 AvailableAudioTracks list<TrackStruct> / null 音轨与字幕 可用音轨列表
0x0009 ActiveTextTrack TrackStruct / null 音轨与字幕 当前字幕轨道
0x000A AvailableTextTracks list<TrackStruct> / null 音轨与字幕 可用字幕轨道列表

播放状态(0x0000)

描述设备当前的播放状态。这是 MediaPlayback 唯一的必选属性。

ID 名称 类型 说明
0x0000 CurrentState(当前状态) PlaybackStateEnum 设备当前的播放状态。App 应订阅此属性来同步界面上的播放/暂停按钮状态。这是 MediaPlayback 唯一的必选属性

时间信息(0x0001 ~ 0x0006)

描述当前播放内容的时间维度信息:起始时间、总时长、当前进度、播放速度和可跳转范围。这些属性大部分需要 AdvancedSeek(AS) 特性。

时间单位

Duration、SampledPosition.Position、SeekRangeStart、SeekRangeEnd 的单位都是毫秒。 StartTime 和 SampledPosition.UpdatedAt 的单位是微秒级 epoch(UTC 自 1970-01-01 以来的微秒数)。

ID 名称 类型 说明
0x0001 StartTime(开始时间) epoch_us / null 当前媒体内容的起始时间(微秒级 UTC epoch)。对于点播内容,通常是节目的发布时间; 对于直播流,是流的开始时间。Nullable —— null 表示不适用。 需要 AS 特性
0x0002 Duration(总时长) uint64 / null 当前媒体的总时长,单位毫秒。例如一部 90 分钟的电影为 5400000。 Nullable —— null 表示时长未知(如直播流)。 需要 AS 特性
0x0003 SampledPosition(采样位置) PlaybackPositionStruct / null 设备上次采样的播放位置,包含采样时间和对应的播放进度。 App 可结合 PlaybackSpeed 和采样时间差推算当前实际进度。 Nullable —— null 表示设备不支持进度报告。 需要 AS 特性
0x0004 PlaybackSpeed(播放速度) single (float) 当前播放速度倍率。1.0 = 正常速度,2.0 = 2 倍速快进, -1.0 = 正常速度快退,0.0 = 暂停。 支持 VS 特性的设备允许更多速度档位。 需要 AS 特性
0x0005 SeekRangeEnd(跳转范围终点) uint64 / null 可跳转的最远位置,单位毫秒。对于点播内容通常等于 Duration; 对于直播流是当前可回看的最新位置。Seek 命令的 Position 不能超过此值。 Nullable —— null 表示无限制。 需要 AS 特性
0x0006 SeekRangeStart(跳转范围起点) uint64 / null 可跳转的最早位置,单位毫秒。对于点播内容通常是 0; 对于直播流是回看窗口的起始边界。Seek 命令的 Position 不能小于此值。 Nullable —— null 表示无限制。 需要 AS 特性
推算实时进度

设备不会实时推送进度,而是通过 SampledPosition 提供采样快照。 App 需要自行推算当前进度:当前位置 = SampledPosition.Position + (当前时间 - SampledPosition.UpdatedAt) * PlaybackSpeed。 注意 UpdatedAt 单位是微秒,Position 单位是毫秒,计算时需要对齐单位。

音轨与字幕(0x0007 ~ 0x000A)

描述当前媒体可用的音轨和字幕信息,以及当前激活的音轨/字幕。需要 AudioTracks(AT) 或 TextTracks(TT) 特性。

ID 名称 类型 说明
0x0007 ActiveAudioTrack(当前音轨) TrackStruct / null 当前正在使用的音轨。Nullable —— null 表示无音轨激活。 需要 AT 特性
0x0008 AvailableAudioTracks(可用音轨列表) list<TrackStruct> / null 当前媒体提供的所有音轨。用于 App 展示音轨切换列表。 Nullable —— null 表示无音轨信息。 需要 AT 特性
0x0009 ActiveTextTrack(当前字幕) TrackStruct / null 当前正在显示的字幕轨道。Nullable —— null 表示字幕已关闭。 需要 TT 特性
0x000A AvailableTextTracks(可用字幕列表) list<TrackStruct> / null 当前媒体提供的所有字幕轨道。用于 App 展示字幕选择列表。 Nullable —— null 表示无字幕信息。 需要 TT 特性

枚举定义

PlaybackStateEnum —— 播放状态

设备的播放状态枚举。CurrentState 属性的取值范围。

0
Playing 播放中 —— 媒体正在正常播放
1
Paused 已暂停 —— 播放暂停,可恢复
2
NotPlaying 未播放 —— 没有内容在播放(空闲或已停止)
3
Buffering 缓冲中 —— 正在加载媒体数据,播放暂时中断

StatusEnum —— 命令响应状态

PlaybackResponse 中的状态码,指示命令执行结果。

0
Success 成功 —— 命令已成功执行
1
InvalidStateForCommand 状态不允许 —— 当前播放状态下不能执行此命令
2
NotAllowed 不允许 —— 命令被拒绝(如权限不足)
3
NotActive 未激活 —— 没有活跃的播放会话
4
SpeedOutOfRange 速度超限 —— 请求的播放速度不在设备支持范围内
5
SeekOutOfRange 跳转超限 —— 请求的位置超出 SeekRange 范围

数据结构

PlaybackPositionStruct —— 播放位置

描述设备在某一时刻采样的播放进度。用于 SampledPosition 属性。 App 读取此结构后,结合 PlaybackSpeed 和当前时间可推算实时进度。

字段类型说明
UpdatedAt epoch_us 采样时刻(微秒级 UTC epoch)。表示这个位置信息是什么时候获取的
Position uint64 / null 采样时刻的播放位置,单位毫秒。Nullable —— null 表示位置未知

TrackStruct —— 轨道信息

描述一个音轨或字幕轨道的信息。用于音轨和字幕相关的属性。

字段类型说明
ID string 轨道唯一标识符。用于 ActivateAudioTrack 和 ActivateTextTrack 命令的参数
TrackAttributes TrackAttributesStruct 轨道的详细属性信息(见下方)

TrackAttributesStruct —— 轨道属性

字段类型必选说明
LanguageCode string 是 语言代码,遵循 ISO 639-1 标准(如 "zh"、"en"、"ja")
DisplayName string / null 否 可选的显示名称,供 App 直接展示给用户(如 "中文"、"English")。Nullable

Feature 位图

MediaPlayback Cluster 通过 FeatureMap(0xFFFC)声明设备支持哪些高级能力:

Bit 0
AS(AdvancedSeek) 高级跳转 —— 启用 Seek 命令、StartTime、Duration、SampledPosition、PlaybackSpeed、SeekRange 等属性
Bit 1
VS(VariableSpeed) 变速播放 —— 允许 Rewind/FastForward 以多档速度播放(2x、4x 等)
Bit 2
TT(TextTracks) 字幕轨道 —— 启用字幕相关属性和 ActivateTextTrack / DeactivateTextTrack 命令
Bit 3
AT(AudioTracks) 音轨切换 —— 启用音轨相关属性和 ActivateAudioTrack 命令
Bit 4
AA(AudioAdvance) 高级音频 —— 支持音频输出路由等高级音频管理能力
Feature 组合示例

简单蓝牙音箱:FeatureMap = 0x00(仅基础播控)。 智能电视:FeatureMap = 0x0F(AS + VS + TT + AT = 0b01111),支持进度条、变速、字幕、多音轨。 流媒体盒子:FeatureMap = 0x1F(全部特性),完整媒体播放体验。

示例数据

一台正在播放电影的智能电视(启用 AS + VS + AT + TT 特性)的 MediaPlayback Cluster 读取结果:

{
  // --- 播放状态 ---
  "0x0000": 0,                // CurrentState = Playing(正在播放)

  // --- 时间信息(需要 AS 特性)---
  "0x0001": 1695400000000000,  // StartTime(媒体起始时间,微秒级 epoch)
  "0x0002": 5400000,           // Duration = 5,400,000 毫秒(90 分钟)
  "0x0003": {                  // SampledPosition(采样位置)
    "UpdatedAt": 1695401200000000,
    "Position": 1230000
  },
  "0x0004": 1.0,               // PlaybackSpeed = 1.0(正常速度)
  "0x0005": 5400000,           // SeekRangeEnd = 5,400,000 毫秒
  "0x0006": 0,                 // SeekRangeStart = 0 毫秒

  // --- 音轨信息(需要 AT 特性)---
  "0x0007": {                  // ActiveAudioTrack
    "ID": "audio-zh",
    "TrackAttributes": {
      "LanguageCode": "zh",
      "DisplayName": "中文"
    }
  },
  "0x0008": [                  // AvailableAudioTracks
    { "ID": "audio-zh", "TrackAttributes": { "LanguageCode": "zh", "DisplayName": "中文" } },
    { "ID": "audio-en", "TrackAttributes": { "LanguageCode": "en", "DisplayName": "English" } }
  ],

  // --- 字幕信息(需要 TT 特性)---
  "0x0009": {                  // ActiveTextTrack
    "ID": "sub-zh",
    "TrackAttributes": {
      "LanguageCode": "zh",
      "DisplayName": "中文字幕"
    }
  },
  "0x000A": [                  // AvailableTextTracks
    { "ID": "sub-zh", "TrackAttributes": { "LanguageCode": "zh", "DisplayName": "中文字幕" } },
    { "ID": "sub-en", "TrackAttributes": { "LanguageCode": "en", "DisplayName": "English Subtitles" } }
  ]
}
开发提示

大部分属性都是 Nullable 的,简单设备可能只上报 CurrentState (0x0000)。 读取前可先检查 FeatureMap (0xFFFC) 判断设备支持哪些特性, 再按需读取对应属性,避免读取不存在的属性导致错误。

常见场景

场景 1:智能电视播放控制与进度条
  1. 读取 FeatureMap (0xFFFC),确认设备支持 AdvancedSeek(AS)特性
  2. 发送 Play (0x00) 开始播放,订阅 CurrentState (0x0000) 同步播放按钮状态
  3. 读取 Duration (0x0002) 获取总时长,渲染进度条
  4. 定期读取 SampledPosition (0x0003),结合 PlaybackSpeed (0x0004) 推算当前进度,更新进度条位置
  5. 用户拖动进度条时,读取 SeekRangeStart (0x0006) 和 SeekRangeEnd (0x0005) 确认范围,然后发送 Seek (0x0B) 跳转
  6. 用户点击暂停按钮,发送 Pause (0x01);再次点击播放,发送 Play (0x00)
场景 2:多语言电影的音轨和字幕切换
  1. 读取 FeatureMap,确认设备支持 AudioTracks(AT)和 TextTracks(TT)
  2. 读取 AvailableAudioTracks (0x0008),在 App 中展示音轨选择列表(如「中文配音」「英文原声」「日语」)
  3. 读取 AvailableTextTracks (0x000A),在 App 中展示字幕选择列表(如「中文字幕」「英文字幕」「关闭」)
  4. 用户选择英文原声 + 中文字幕:
    • 发送 ActivateAudioTrack (0x0C),TrackID 设为英文音轨 ID
    • 发送 ActivateTextTrack (0x0D),TrackID 设为中文字幕 ID
  5. 用户想关闭字幕:发送 DeactivateTextTrack (0x0E)
  6. 订阅 ActiveAudioTrack (0x0007) 和 ActiveTextTrack (0x0009) 同步 App 显示的当前选中项