SMAPI服务中positionInformation被Sonos忽略问题求助
Sonos SMAPI 恢复播放位置失效排查方案
针对你遇到的Sonos忽略positionInformation、始终从头播放的问题,结合你的配置信息,整理以下排查方向:
1. 确认触发恢复播放的场景
Sonos仅在恢复之前暂停/中断的播放会话时,才会读取positionInformation中的偏移量。如果是用户主动选择曲目、首次加载播放列表,或者重新启动播放会话,Sonos会默认从头开始播放,这属于正常逻辑。请先验证测试场景是否是从暂停状态恢复播放。
2. 检查元数据与偏移量的单位一致性
你的getMetadata响应中,trackMetadata/duration字段值为600(单位是秒,对应10分钟),而getMediaUri中的offsetMillis是30000(单位是毫秒,对应30秒),数值逻辑上是合理的,但要确保:
offsetMillis必须小于duration * 1000,否则Sonos会忽略偏移量canResume字段已正确设置为true(你的配置中已满足)
3. 验证positionInformation字段匹配性
positionInformation中的id必须与getMetadata返回的mediaMetadata/id完全一致(你的配置中均为track::123,无问题);index需对应曲目在播放列表中的位置(你的配置中均为0,匹配)。如果字段不匹配,Sonos会无法关联播放位置。
4. 确保音频文件支持字节范围请求
Sonos实现跳转播放依赖音频服务器支持HTTP Range请求。如果你的服务器不响应Range头,Sonos无法从指定偏移量加载音频,只能从头播放。可以通过以下命令测试:
curl -I https://my-sonos-service.com/testaudio.mp3
检查响应头是否包含Accept-Ranges: bytes,再发送Range请求验证:
curl -H "Range: bytes=30000-" https://my-sonos-service.com/testaudio.mp3 -I
确认返回206 Partial Content状态码。
5. 清除Sonos设备缓存
Sonos会缓存媒体元数据和播放位置,可能导致配置更新不生效。尝试:
- 在Sonos应用中移除你的服务,重新添加
- 重启Sonos设备
- 使用新的曲目ID进行测试,避免缓存干扰
你的原响应参考
getMetadata响应:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.sonos.com/Services/1.1"> <soap:Body> <ns:getMetadataResponse> <ns:getMetadataResult> <ns:index>0</ns:index> <ns:count>41</ns:count> <ns:total>41</ns:total> <ns:mediaMetadata> <ns:id>track::123</ns:id> <ns:itemType>track</ns:itemType> <ns:title>Test track 1</ns:title> <ns:mimeType>audio/mp3</ns:mimeType> <ns:trackMetadata> <ns:artistId>A:123456</ns:artistId> <ns:artist>Test Artist</ns:artist> <ns:albumid>M:123456</ns:albumid> <ns:album>test Album</ns:album> <ns:duration>600</ns:duration> <ns:albumArtURI>http://example.com/images/aa/1.jpg</ns:albumArtURI> <ns:canSkip>false</ns:canSkip> <ns:canResume>true</ns:canResume> <ns:canAddToFavorites>false</ns:canAddToFavorites> </ns:trackMetadata> </ns:mediaMetadata> ... </soap:Body> </soap:Envelope>
getMediaUri响应:
<?xml version="1.0"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.sonos.com/Services/1.1"> <s:Body> <ns:getMediaURIResponse> <ns:getMediaURIResult>https://my-sonos-service.com/testaudio.mp3</ns:getMediaURIResult> <ns:positionInformation> <ns:id>track::123</ns:id> <ns:index>0</ns:index> <ns:offsetMillis>30000</ns:offsetMillis> </ns:positionInformation> </ns:getMediaURIResponse> </s:Body> </s:Envelope>
内容的提问来源于stack exchange,提问作者RobEW
相关产品推荐
相关产品推荐

