从S3获取ogg音轨长度而不下载整个文件
我想知道怎么在不下载整个ogg文件的情况下,获取它的播放时长。我知道这是可能的,因为HTML5标签和VLC播放器都能在加载网址后立即显示整个播放时长,而不需要下载整个文件。
有没有什么头部信息或者其他东西我可以读取?也许可以看看比特率,然后用文件大小去除以它,来大概算出播放时长?
3 个回答
0
这件事是没办法做到的,除非你先下载数据本身。你可以把相关的信息放在S3的元数据里,这样在真正下载数据之前,你就可以先查看这些元数据。
2
这 是 可行的。实现这个的方法是使用 HTTP范围请求 来获取文件的末尾,找到最后一个Ogg页面,并从中提取时间戳。这是基于文件由连续的流组成(也就是说,没有链式结构),而且所有流的长度相同,并且流的时间从0开始(如果不是这样,你需要解码流的开头,并从最终时间戳中减去那个时间戳)。从Ogg页面的granulepos字段解码时间戳是与编解码器相关的(例如,对于Vorbis,它以样本数表示)。
另外,如果你的Ogg文件包含 Ogg Skeleton 元数据,你可以直接读取它来确定文件的时长。
10
很遗憾,目前似乎没有办法做到这一点。
Mozilla的Ogg媒体服务器配置提供了很多有用的信息。简单来说:
- Gecko会使用一个叫做
X-Content-Duration
的头部信息,这个信息是由网络服务器发送的,如果服务器有这个信息的话。这就解释了你提到的HTML5音频流的例子。如果没有这个信息, - Gecko会根据头部中的采样率和
Content-length
这个HTTP头部中的文件大小来估算音频的长度。
采样率存储在识别头部,也就是第一个头部数据包中。想了解更多,可以查看这个规范,找到“4.2 头部解码和解码设置”这一节。