在 JavaScript 中对音频文件进行计时不准确

Inaccuracy in timing an audio file in JavaScript

本文关键字:不准确 文件 JavaScript 音频      更新时间:2023-09-26

我正在玩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 毫秒的值。有谁知道为什么会这样?播放音频文件真的需要那么长时间吗?

MP3 文件对样本不准确。 MP3 在具有固定帧大小的时域中工作。 典型的帧大小为 26 毫秒。 这是您使用 MP3 获得的最小时间分辨率。

您的音频文件并不完全是 1 秒长,除非您有一些非常奇怪的采样率可以均匀地整除成一秒......如果你有那个,它无论如何都不会在 MP3 中工作。

您遇到的下一个问题是启动 MP3 的音频。 MP3 音频不会在第一帧立即开始。 不同的编码器使用不同数量的填充。 播放"无缝"MP3文件也有同样的问题。

最后,您的浏览器并不总是在播放音频。 通常有一个底层库来处理它,有时这些库不能很好地链接到浏览器。 浏览器可能知道音频何时开始和何时停止,但它不会确切知道。 在浏览器中处理消息时,音频播放可能发生在半秒前。 有些设备甚至具有硬件编解码器,在减轻CPU负载的同时增加了一些复杂性。

如果您的音频文件较长,则可能会出现时钟漂移的问题。 音频可能以 44.1kHz 录制,但您的计算机可能会以 44.095kHz 左右的速度播放。 随着时间的推移,这种差异会加起来。

基本上,您永远无法真正知道数字音频文件有多长。 像 MP3 这样的有损格式使这变得更加复杂。 无法可靠地查找的远程文件意味着播放器必须根据文件大小和平均比特率来猜测文件的长度。 即使你解决了所有问题,时钟漂移仍然有一些影响,除非与普通时钟同步(如GPS信号,但由于大气,这也不准确)。