我在玩HTML5<audio>
标签,发现与该currentTime
属性有关的某些奇怪行为。
我想播放本地音频文件timeupdate
,并通过将currentTime
属性与duration
属性进行比较来让事件检测其结束时间。
如果我让歌曲从头到尾播放,这实际上可以正常工作-正确确定了歌曲的结尾。
但是,currentTime
手动更改(直接通过JavaScript或使用基于浏览器的音频控件)会导致API不再提供正确的值,currentTime
而是将其设置为比实际播放位置早几秒钟。
(前面的“几秒钟”是基于Chrome的,Firefox似乎完全疯了,这导致差异越来越大。)
有关此问题的jsFiddle例子:http : //jsfiddle.net/yp3o8cyw/2/
谁能告诉我为什么会这样-还是我只是不正确API应该做什么?
PS:我只是注意到这实际上仅发生在MP3编码的文件中,OGG文件完全正常。
首先,我实际上无法在计算机上重现您的问题,但是目前我手头上只有一个简短的MP3文件,因此可能是问题所在。无论如何,我想我可以解释发生了什么。
MP3文件(MPEG)是非常简单的流,并且其中没有绝对位置数据。从读取文件的第一部分不可能知道任意帧从什么字节偏移开始。媒体播放器通过落针查找文件。也就是说,它知道整个轨道的大小以及时间偏移量大致在轨道中的距离。它猜测并开始解码,并在与下一个帧头同步后立即开始接收。这是一个不精确的过程。
Ogg是一个更强大的容器,并且在其帧头中内置了时间偏移。查找Ogg文件要简单得多。
另一个问题是大多数支持MP3的浏览器都这样做是因为编解码器已经在您的系统上可用。播放Ogg Vorbis和MP3通常是具有不同API的完全不同的库。尽管Web标准在提供通用抽象方面做了很多工作,但是次要的实现细节却引起您所看到的怪癖。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句