Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML音频对象报告错误的文件持续时间_Javascript_Html_Audio_Html5 Audio - Fatal编程技术网

Javascript HTML音频对象报告错误的文件持续时间

Javascript HTML音频对象报告错误的文件持续时间,javascript,html,audio,html5-audio,Javascript,Html,Audio,Html5 Audio,我开始使用AAC音频文件而不是MP3来避免时间漂移,但现在我发现自己在Chrome中遇到了一个问题,报告的音频持续时间不正确 我有一个音频样本,可以帮助说明这个问题。音频的实际持续时间为22:01,但Chrome显示的持续时间为20:13,但如果您实际播放音频的结尾,则持续时间将开始改变,直到达到正确的持续时间为止 问题的根源是什么?我读到也许可以通过输入正确的元数据来解决这个问题,但它似乎是正确的 一些有趣的数据: Chrome中的MP3显示21:58 Safari中的AAC显示22:10

我开始使用AAC音频文件而不是MP3来避免时间漂移,但现在我发现自己在Chrome中遇到了一个问题,报告的音频持续时间不正确

我有一个音频样本,可以帮助说明这个问题。音频的实际持续时间为22:01,但Chrome显示的持续时间为20:13,但如果您实际播放音频的结尾,则持续时间将开始改变,直到达到正确的持续时间为止

问题的根源是什么?我读到也许可以通过输入正确的元数据来解决这个问题,但它似乎是正确的

一些有趣的数据:

Chrome中的MP3显示21:58

Safari中的AAC显示22:10

Safari中的MP3显示确切的持续时间22:01

有没有机会让它在任何地方都同样有效


我留下MP3文件以防万一你的音频编码不好。这是音频文件本身,而不是浏览器。确保将原始文件保存为44.1KHz/16位WAV,并使用可靠的AAC编码器

我拿了你的AAC文件,在Adobe Audition中打开,保存为44/16 WAV,使用XLD(MacOS)编码到AAC。我将AAC文件拖到Chrome中,它正确地报告了持续时间

所以我会尝试不同的编码器,直到你找到一个工作正常。

原因 问题在于AAC是一种流式格式。这意味着没有像容器格式(例如“mp4”)那样提供全局文件头,因此浏览器必须根据最初加载的数据包头()的比特率和服务器提供的文件长度来猜测时间

由于在整个流被消耗之前,浏览器不知道实际的样本长度,因此结果将根据浏览器(或底层系统)如何尝试预测持续时间而有所不同

AAC还可以使用可变比特率(VBR)进行编码,这使得很难正确预测持续时间,因为在开始时发现的比特率可能不是稍后用于其他样本数据包的比特率

当然,文件/编码也有可能损坏或出错

顺便说一句,这些同样的挑战也适用于MP3文件。这就是为什么它们有时显示的持续时间也不正确

权变措施 第一种是使用恒定比特率(CBR)对AAC进行编码。这将使浏览器能够更可靠地预测时间,因为如果变化明显,VBR可以在任何点进行计算。这很可能会影响文件大小

如果CBR不是一个选项,一个解决方法是为AAC流(如MP4)提供一个容器格式,它可以将持续时间存储在全局报头中,全局报头在开始时加载-MP4可以作为音频元素的缓冲音频使用。执行此操作时,您将获得正确的时间(小数位可能存在舍入误差):

AAC已加载到Firefox中的MP4容器中:

AAC装在铬合金MP4容器中

要为AAC生成MP4容器,例如,您可以使用带有这些参数的free,它将按原样复制AAC(不进行重新编码,因此结果的质量和比特率将与以前相同):

您还将看到ffmpeg指出这个问题:

[aac@000000000 1C624A0]根据比特率估计持续时间,这可能不准确[…]

另一种可能不太方便的解决方法是将持续时间作为元数据(例如文件名本身(类似于“myfile_MMSS.aac”)提供,或者作为url中的哈希标记/参数提供,或者单独侧面加载元数据


后者将有一定的影响,因为我们不能覆盖本地播放器的持续时间字段(以跨浏览器友好的方式),这可能需要您构建自定义播放器界面,以便您可以将元数据显示为持续时间,而不是浏览器预测的持续时间。

首先,非常感谢您的回答。我可以清楚地看到,你花了你的时间,使它惊人的好。你完全正确的原因,但即使很艰难,我尝试用Adobe Audition使用CBR导出文件,我仍然遇到同样的问题(无论如何,不同的持续时间)。最后我把我使用的程序改成了XLD(MacOS),它运行得非常好。再次非常感谢你@RomanOxman没问题,重要的是现在它可以工作了。请注意:容器格式的AAC的适当文件扩展名是m4a。(mp4用于视频)我尝试在Adobe Audition中使用CBR和多种导出方式,但总是遇到问题,这不是很奇怪吗?最后,我试着像你说的那样使用XLD,效果非常好!!非常感谢你的建议。
ffmpeg.exe -i "Lesson+53-A.aac" -c:a copy "Lesson+53-A.mp4"