ISO/IEC 29341-17-12:UPnP AV AVTransport 服务

UPnP 音频/视频 — 第17-12部分:AVTransport 服务规范

1. AVTransport 服务与传输状态机

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 状态机时,始终使用 CurrentTransportState 和 CurrentTransportStatus 状态变量作为唯一真相来源。切勿从缓存的返回结果推断传输状态——状态可能已因并发控制点调用或内部设备事件而改变。

2. URI 管理与播放导航

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 任意(无状态变化) 检索传输状态和状态信息
TRANSITIONING 状态是 AVTransport 状态机中最常被误解的状态。这是一个瞬态状态,设备在曲目间切换(Next/Previous)或执行定位操作时进入该状态。控制点在 TRANSITIONING 期间不得发出新的传输命令——应等待设备返回 PLAYING、PAUSED_PLAYBACK 或 STOPPED 后再发出进一步动作。

3. AVTransport 的工程设计见解

实现健壮的 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 状态变量,允许控制点调整同步偏移量(以毫秒为单位),以补偿音频和视频路径中不同的处理延迟。正偏移量延迟音频相对于视频;负偏移量提前音频。

通过使用 SetNextAVTransportURI 在当前曲目仍在播放时预缓冲后续曲目来实现无缝播放。这种技术消除了在当前曲目结束后设置新 URI 时发生的曲目间静默间隙。对于本地文件播放,在当前曲目播放到最后 5-10 秒时开始解码下一曲目,以确保无论解码器初始化延迟如何都能实现无缝过渡。
切勿在底层解码器执行耗时操作(如格式检测或缓冲区初始化)时阻塞 AVTransport 动作处理程序。立即返回动作,状态设置为 TRANSITIONING,并在操作完成时异步将状态更新为 PLAYING 或 STOPPED。阻塞动作处理程序会拖慢整个 UPnP 设备栈,降低所有并发控制点的响应性。

4. 常见问题

问:AVTransport 能否同时处理流媒体(如 HTTP 直播流)和本地文件播放?
答:可以。基于 URI 的内容模型与传输无关。相同的 AVTransport 动作同时处理本地 URI(file://, internal://)和网络 URI(http://, rtsp://, mms://)。不过,定位行为有所不同——直播流上的定位操作可能受限或不被支持,设备通过 SeekMode 状态变量指示此情况。
问:服务如何处理多个控制点发出冲突的传输命令?
答:AVTransport 服务按顺序处理动作。如果两个控制点同时发出 Play 命令,两者都成功(从 PLAYING 状态发出的第二个 Play 是无害的幂等操作)。来自不同控制点的冲突命令(如 Play 和 Stop)通过动作排序解决——状态机处理之前最后接收的动作生效。
问:在活跃播放期间调用 SetAVTransportURI 会发生什么?
答:设备停止当前播放,将传输状态重置为 STOPPED,加载新的 URI,然后等待 Play 命令。CurrentTrackURI 和 CurrentTrackMetadata 状态变量更新以反映新内容。
问:通过 SetNextAVTransportURI 可以排队多少曲目?
答:标准未在 AVTransport 内定义播放列表机制。仅支持单个下一 URI。对于多曲目播放列表,控制点应管理队列并在前一首曲目完成时使用每个后续曲目调用 SetAVTransportURI,监控传输状态以检测曲目完成事件。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注