HTML5音频 - currentTime属性不准确?

Loi*_*ilo 6 javascript audio html5 mp3 html5-audio

我正在玩HTML5 <audio>标签,我注意到一些与该currentTime属性有关的奇怪行为.

我希望播放本地音频文件timeupdate,并通过将currentTime属性与duration属性进行比较,让事件在完成时进行检测.

如果我让歌曲从头到尾播放,这实际上工作得很好 - 歌曲的结尾是正确的.

但是,currentTime手动更改(直接通过JavaScript或使用基于浏览器的音频控件)会导致API不再返回正确的值,currentTime但似乎将其设置为实际播放位置的前几秒.

(这些"几秒钟"前面是基于Chrome,Firefox似乎完全疯了,导致差异变得更大.)

关于这个问题的一个小jsFiddle示例:http://jsfiddle.net/yp3o8cyw/2/

任何人都可以告诉我为什么会发生这种情况 - 或者我是不是正确的API应该做什么?

PS:我刚注意到这实际上只发生在MP3编码的文件中,OGG文件完全没问题.

Bri*_*ald 11

经过几个小时的斗争这个神秘的问题,我相信我已经弄明白这里发生了什么.这不是.ogg vs .mp3的问题,这是关于mp3(可能还有其他文件类型)的变量与恒定比特率编码的问题.

我不能因为发现这一点而受到赞誉,只是为了搜寻互联网.绅士和学者Terrill Thompson 在2015年2月1日写了一篇关于这个问题的详细文章.

我正在为遇到这个同步问题的任何其他人写这个(这使得音频和文本的精确同步变得不可能),因为如果你这样做,那么弄清楚发生了什么是一个真正的噩梦.

我的下一步是进行更多测试,最后找出一种将所有.mp3转换为恒定比特率的有效方法.我在想FFMPEG可能会有所帮助,但我会在另一个线程中探索它.还要感谢Loilo最初发布关于这个问题的信息,感谢Brad分享的信息.

  • 嘿@AlexKempton,在搞砸了一段时间后我发现它实际上与你的mp3上的变量与常数/固定比特率完全相关.长话短说,使用恒定/固定比特率,你应该没有问题(根据我的经验).使用可变比特率,你可能会遇到讨厌的时间问题.http://terrillthompson.com/blog/624 (3认同)

Bra*_*rad 5

首先,我实际上无法在我的机器上重现您的问题,但我现在只有一个简短的MP3文件,所以这可能是问题所在.无论如何,我想我可以解释发生了什么.

MP3文件(MPEG)是非常简单的流,并且其中没有绝对位置数据.读取文件的第一部分是不可能知道某个任意帧开始的字节偏移量.媒体播放器通过针脚搜索文件.也就是说,它知道整个轨道的大小以及大致距离轨道的距离.它猜测并开始解码,一旦与下一帧标题同步就立即拾取.这是一个不精确的过程.

Ogg是一个更健壮的容器,并且在其框架头中内置了时间偏移.寻找一个Ogg文件要简单得多.

另一个问题是,大多数支持MP3的浏览器都是这样做的,因为您的系统上已经有了编解码器.播放Ogg Vorbis和MP3通常是完全不同的具有不同API的库.虽然Web标准在提供通用抽象方面做了很多工作,但是较小的实现细节会引起您所看到的怪癖.

  • @Loilo所有这些库都在后台使用完全相同的浏览器实现.唯一没有的是Aurora. (2认同)