Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
ISO/IEC 29341-17-12 规定了 AVTransport 服务,这是 UPnP AV 架构中的核心播放控制组件。ConnectionManager 处理媒体连接的建立,而 AVTransport 负责控制媒体内容的实际播放——管理传输状态机、基于 URI 的内容选择、定位、速度控制以及基于曲目的播放导航。该服务是控制点实现熟悉的播放-暂停-停止-定位用户体验的主要接口。
AVTransport 服务维护一个正式的传输状态机,用于管理设备的播放行为。核心状态包括 STOPPED、PLAYING、PAUSED_PLAYBACK、TRANSITIONING 和 NO_MEDIA_PRESENT。每个状态都有由特定动作触发的明确定义的合法转换。例如,从 STOPPED 状态,唯一合法的转换是到 PLAYING(通过 Play)或到 NO_MEDIA_PRESENT(如果媒体被移除)。从 PLAYING 状态,传输可以转换到 PAUSED_PLAYBACK(通过 Pause)、STOPPED(通过 Stop)或 TRANSITIONING(通过 Next 或 Previous 切换曲目时)。控制点必须遵守这些状态机语义以确保可预测的设备行为。
AVTransport 服务使用基于 URI 的内容模型。控制点通过调用 SetAVTransportURI 设置要播放的内容,传入指向媒体资源的 URI 和描述内容的当前 URI 元数据字符串(DIDL-Lite 格式)。服务还通过 SetNextAVTransportURI 支持下一 URI,实现连续曲目之间的无缝播放——设备在当前曲目仍在播放时预缓冲下一曲目,消除歌曲或视频章节之间的静默间隙。
播放导航动作包括用于曲目跳转的 Next 和 Previous、用于曲目内位置导航的 Seek、以及带有 Speed 参数的可变速 Play。Seek 动作支持多种单位类型:TRACK_NR(定位到多曲目资源中的特定曲目)、ABS_TIME(定位到绝对时间位置)、REL_TIME(相对时间定位)、ABS_COUNT(帧精确定位)以及 X_DLNA_REL_BYTE(DLNA 优化场景下的字节级定位)。GetPositionInfo 动作同时以多种单位格式返回当前播放位置,允许控制点无需额外转换即可显示位置信息。
| 动作 | 状态转换 | 描述 | 常见错误代码 |
|---|---|---|---|
| SetAVTransportURI | 任意 -> STOPPED(或清除 NO_MEDIA_PRESENT) | 设置要播放的媒体 URI | 716(不支持定位模式),718(非法 MIME 类型) |
| Play | STOPPED/PAUSED_PLAYBACK -> PLAYING | 以指定速度开始或恢复播放 | 703(无效状态),705(无媒体存在) |
| Pause | PLAYING -> PAUSED_PLAYBACK | 临时暂停播放 | 703(无效状态)如果不在 PLAYING 状态 |
| Stop | PLAYING/PAUSED_PLAYBACK -> STOPPED | 停止播放并重置位置 | 703(无效状态)如果已在 STOPPED 状态 |
| Seek | PLAYING/PAUSED_PLAYBACK -> TRANSITIONING | 定位到媒体中的指定位置 | 716(不支持定位模式),717(非法的定位目标) |
| Next | PLAYING/PAUSED_PLAYBACK/STOPPED -> TRANSITIONING | 跳到下一曲目 | 712(无此资源)如果未设置下一 URI |
| Previous | PLAYING/PAUSED_PLAYBACK/STOPPED -> TRANSITIONING | 转到上一曲目或重新开始当前曲目 | 712(无此资源)在第一曲目时 |
| GetPositionInfo | 任意(无状态变化) | 检索当前播放位置 | 无 |
| GetTransportInfo | 任意(无状态变化) | 检索传输状态和状态信息 | 无 |
实现健壮的 AVTransport 服务需要处理多个异步复杂性。最重要的是管理传输状态机与底层媒体解码器管道之间的关系。解码器初始化、缓冲区预滚和音视频同步都需要实际时间,设备必须通过状态变量准确反映这些阶段。例如,SetAVTransportURI 之后,设备应在缓冲时将 CurrentTransportState 设置为 STOPPED,然后在 Play 被调用且足够数据已缓冲后转换到 PLAYING。
多个 AVTransport 实例(由 AVTransportID 标识)允许单个设备同时管理多个独立的播放会话。每个实例拥有自己的状态机、URI、位置和传输设置。这对于多房间音频系统、画中画视频或需要在录制时监控播放的录制设备至关重要。ConnectionManager 的 PrepareForConnection 动作将连接与特定的 AVTransport 实例关联,控制点在所有后续的 AVTransport 动作调用中包含 AVTransportID。
Play 动作的 Speed 参数值得仔细的工程关注。标准规定 Speed=1 表示正常播放,大于 1 的值表示快进(如 2、4、8、16、32),0 到 1 之间的值(不含)表示慢动作。负值表示反向播放。设备必须通过 TransportPlaySpeed 状态变量通告其支持的速度,控制点必须在尝试非正常速度播放前查询该变量。工程师应优雅地实现速度转换,在解码器管道支持的情况下在非标准速度下保持音视频同步。
音频同步(唇同步)是一个微妙但关键的实现细节。当 AVTransport 服务同时管理音频和视频流时,必须确保音频输出与视频帧保持同步。标准定义了 AVSyncOffset 状态变量,允许控制点调整同步偏移量(以毫秒为单位),以补偿音频和视频路径中不同的处理延迟。正偏移量延迟音频相对于视频;负偏移量提前音频。