不从文件开头开始的有声读物章节
Audiobook chapters that don't start at beginning of file
我们已经实施了 SMAPI 服务,并正在尝试提供有声读物。我们可以 select 有声读物并开始播放,但是当我们想在章节之间移动时 运行 会遇到问题,因为我们的音频文件没有按章节拆分。每本有声读物大致分为 equal-length 个部分,我们了解每章从哪个部分开始以及从该部分开始到什么程度的信息。
所以我们 运行 遇到了一个问题,我们的 getMetadata
响应返回有声读物的章节,因为这是我们希望用户能够浏览这本书的方式,但是我们的 getMediaURI
对每一章的回复都返回了音频文件分成的部分的 URL,我们似乎无法从这些文件中的特定位置开始。
我们解决问题的第一个尝试是在我们的 getMediaURI
响应中包含 positionInformation
。这仍然会给我们留下一个问题,即在适当的地方结束一章,但可能让我们从适当的地方开始。但是根据 the Sonos docs,您并不打算包含个别有声读物章节的位置信息,而且它似乎被忽略了。
我们的第二个想法,也可能是更好的解决方案,是使用 getMediaURI
响应的 httpHeaders
部分仅为该部分设置 Range
header对应章节的文件。但是 Sonos 似乎对我们设置 Range
header 有问题,并且似乎要么忽略我们的 header 要么在我们尝试播放章节时中断。我们假设这是因为 Sonos is trying to set its own Range
headers.
我们目前的想法是,我们可能能够通过某种代理传递媒体 URL,调整 Sonos Range
header 通过添加偏移到开始和结束值基于章节在音频文件中开始的位置。
所以现在我们 return <fileUrl>
来自 getMediaURI
并且 Sonos 发送这样的请求:
<fileUrl>
Range: bytes=100-200
相反,我们将从 getMediaURI
return <proxyUrl>?url=<urlEncodedFileUrl>&offset=3000
。 Sonos 会发送这样的信息:
<proxyUrl>?url=<htmlEncodedFileUrl>&offset=3000
Range: bytes=100-200
代理会重定向到这样的地方:
<fileUrl>
Range: bytes=3100-3200
有没有其他人处理过与他们的章节不匹配的音频文件one-to-one?你是怎么处理的?
简单的回答是 Sonos 播放器尊重文件的持续时间,而不是元数据中表示的持续时间。您无法使用 positionInformation
或 Cloud Queues 来解决这个问题。
但是,您不应该对有声读物的章节使用 positonInformation
的注释似乎不正确,因此我将其删除。 Saving and Resuming documentation 声明如果用户正在恢复收听,您应该包括它。您可以使用它在音频文件中的特定位置开始播放。您在尝试执行此操作时收到错误消息了吗?
请注意,您无法在文件内停止播放(例如,如果一章在文件结束之前结束)。播放器会在停止之前播放整个文件。元数据在文件末尾之前也不会更改。因此,例如,如果文件的元数据是 "Chapter 2" 并且第 2 章在文件结尾之前结束,则 Sonos 应用程序仍会显示 "Chapter 2" 直到文件结尾。
另请注意,报告 API 已被弃用。请参阅 Add Reporting 了解您的服务应托管的新报告端点。
我们已经实施了 SMAPI 服务,并正在尝试提供有声读物。我们可以 select 有声读物并开始播放,但是当我们想在章节之间移动时 运行 会遇到问题,因为我们的音频文件没有按章节拆分。每本有声读物大致分为 equal-length 个部分,我们了解每章从哪个部分开始以及从该部分开始到什么程度的信息。
所以我们 运行 遇到了一个问题,我们的 getMetadata
响应返回有声读物的章节,因为这是我们希望用户能够浏览这本书的方式,但是我们的 getMediaURI
对每一章的回复都返回了音频文件分成的部分的 URL,我们似乎无法从这些文件中的特定位置开始。
我们解决问题的第一个尝试是在我们的 getMediaURI
响应中包含 positionInformation
。这仍然会给我们留下一个问题,即在适当的地方结束一章,但可能让我们从适当的地方开始。但是根据 the Sonos docs,您并不打算包含个别有声读物章节的位置信息,而且它似乎被忽略了。
我们的第二个想法,也可能是更好的解决方案,是使用 getMediaURI
响应的 httpHeaders
部分仅为该部分设置 Range
header对应章节的文件。但是 Sonos 似乎对我们设置 Range
header 有问题,并且似乎要么忽略我们的 header 要么在我们尝试播放章节时中断。我们假设这是因为 Sonos is trying to set its own Range
headers.
我们目前的想法是,我们可能能够通过某种代理传递媒体 URL,调整 Sonos Range
header 通过添加偏移到开始和结束值基于章节在音频文件中开始的位置。
所以现在我们 return <fileUrl>
来自 getMediaURI
并且 Sonos 发送这样的请求:
<fileUrl>
Range: bytes=100-200
相反,我们将从 getMediaURI
return <proxyUrl>?url=<urlEncodedFileUrl>&offset=3000
。 Sonos 会发送这样的信息:
<proxyUrl>?url=<htmlEncodedFileUrl>&offset=3000
Range: bytes=100-200
代理会重定向到这样的地方:
<fileUrl>
Range: bytes=3100-3200
有没有其他人处理过与他们的章节不匹配的音频文件one-to-one?你是怎么处理的?
简单的回答是 Sonos 播放器尊重文件的持续时间,而不是元数据中表示的持续时间。您无法使用 positionInformation
或 Cloud Queues 来解决这个问题。
但是,您不应该对有声读物的章节使用 positonInformation
的注释似乎不正确,因此我将其删除。 Saving and Resuming documentation 声明如果用户正在恢复收听,您应该包括它。您可以使用它在音频文件中的特定位置开始播放。您在尝试执行此操作时收到错误消息了吗?
请注意,您无法在文件内停止播放(例如,如果一章在文件结束之前结束)。播放器会在停止之前播放整个文件。元数据在文件末尾之前也不会更改。因此,例如,如果文件的元数据是 "Chapter 2" 并且第 2 章在文件结尾之前结束,则 Sonos 应用程序仍会显示 "Chapter 2" 直到文件结尾。
另请注意,报告 API 已被弃用。请参阅 Add Reporting 了解您的服务应托管的新报告端点。