我正在玩
HTML5< audio>标签,我注意到一些与currentTime属性有关的奇怪行为.
我希望播放本地音频文件,并通过将currentTime属性与duration属性进行比较,让timeupdate事件在完成时进行检测.
如果我让歌曲从头到尾播放,这实际上工作得很好 – 歌曲的结尾是正确的.
但是,手动更改currentTime(直接通过JavaScript或使用基于浏览器的音频控件)会导致API不再返回currentTime的正确值,但似乎设置它比实际播放的位置提前几秒.
(这些“几秒钟”前面是基于Chrome,Firefox似乎完全疯了,导致差异变得更大.)
关于这个问题的一个小jsFiddle示例:http://jsfiddle.net/yp3o8cyw/2/
任何人都可以告诉我为什么会发生这种情况 – 或者我是不是正确的API应该做什么?
解决方法
首先,我实际上无法在我的机器上重现您的问题,但我现在只有一个简短的MP3文件,所以这可能是问题所在.无论如何,我想我可以解释发生了什么.
MP3文件(MPEG)是非常简单的流,并且其中没有绝对位置数据.读取文件的第一部分是不可能知道某个任意帧开始的字节偏移量.媒体播放器通过针脚搜索文件.也就是说,它知道整个轨道的大小以及大致距离轨道的距离.它猜测并开始解码,一旦与下一帧标题同步就立即拾取.这是一个不精确的过程.
Ogg是一个更健壮的容器,并且在其框架头中内置了时间偏移.寻找一个Ogg文件要简单得多.
另一个问题是,大多数支持MP3的浏览器都是这样做的,因为您的系统上已经有了编解码器.播放Ogg Vorbis和MP3通常是完全不同的具有不同API的库.虽然Web标准在提供通用抽象方面做了很多工作,但是较小的实现细节会引起您所看到的怪癖.