我正在玩JavaScript音频,我注意到当我为音频文件计时时,我得到的数字不等于音频文件的长度。我使用的代码是这样的:
var audio = new Audio("sound.mp3");
var start, stop;
audio.addEventListener("ended", function() {
stop = performance.now() - start;
});
start = performance.now();
audio.play();
当sound.mp3只有1000毫秒长时,我会从stop
获得一个值,该值大于音频文件长度的50毫秒到350毫秒。有谁知道为什么会这样?播放音频文件实际上花了那么长时间吗?
答案 0 :(得分:3)
MP3文件不是样本准确的。 MP3在固定帧大小的时域中工作。典型的帧大小为26毫秒。这是使用MP3获得的最低时间分辨率。
你的音频文件不是1秒钟,除非你有一些非常奇怪的采样率可以平均分成一秒......如果你有这样的话,它无论如何都不能用于MP3。
您遇到的下一个问题是启动MP3的音频。 MP3音频不会立即在第一帧开始。不同的编码器使用不同数量的填充。玩"无间隙" MP3文件有同样的问题。
最后,您的浏览器并不总是进行音频播放。通常有一个底层库来处理它,有时这些库不能很好地链接到浏览器。浏览器可能知道音频何时开始以及何时停止,但它并不确切知道。当消息在浏览器中处理时,音频播放可能在半秒前发生。有些设备甚至具有硬件编解码器,在减轻CPU负载的同时增加了一些复杂性。
如果音频文件较长,则可能存在时钟漂移问题。音频可能以44.1kHz的速度录制,但您的计算机可能会以44.095kHz左右的速度播放。随着时间的推移,差异会增加。
基本上,你永远无法真正知道数字音频文件有多长。像MP3这样的有损格式使这更加复杂。无法可靠搜索的远程文件意味着播放器必须根据文件大小和平均比特率猜测文件的长度。即使您解决了所有问题,时钟漂移仍然会产生一些效果,如果不能与普通时钟同步(例如GPS信号,但由于大气层而不准确),这些效果无法消除。