在 JavaScript 中对音频文件进行计时不准确
Inaccuracy in timing an audio file in JavaScript
我正在玩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信号,但由于大气,这也不准确)。
- Angular 2:在本地.json文件上找不到文件
- 放大弹出生成“;找不到文件”;YouTube视频的错误
- jquery打印[object XMLDocument]而不是文件内容
- Web 地址虚拟目录会断开外部 JavaScript 链接,因此找不到文件
- ASP.NET MVC 脚本.渲染不合并文件..
- 在 JavaScript 中对音频文件进行计时不准确
- 如何在不打开文件的情况下下载文件
- 谷歌地图API-缩小时默认标记不准确
- javaScript警报和提示框将我重定向到另一个页面,上面写着“;找不到文件”;
- 可以't在不提供文件扩展名的情况下导入TypeScript模块
- 浏览器不生成文件下载对话框
- XMLHttpRequest内容长度不等于文件的实际大小
- 轨道:找不到文件“提前输入.js”.直到我删除“数据涡轮链接”
- Socket.io 设置间隔不准确
- 呵呵!与 npm 找不到文件有关
- CreateJS的PreloadJS进度事件不准确
- kineticjs - 鼠标悬停不准确
- 使用 PDF 打开 PDF 文件.js而不将文件作为查询字符串传递
- 计算何时多次写入文件会导致不准确
- jquery文件上传进度条不准确