4

在某些音频文件上,MediaElement.NaturalDuration 的值小于音频的实际持续时间。当我在 Windows Media Player 中打开文件时,持续时间是正确的(当我查看文件的属性时也是如此)。虽然 NaturalDuration 属性的值不正确,但音频已完全播放,但在某些时候,Position 属性的值变得大于 NaturalDuration 属性的值,据我了解,这绝不应该发生。

我创建了一个简单的应用程序来重现该问题:https ://skydrive.live.com/redir?resid=ACF8BFD4384116CE!2908&authkey=!AG-wF6Ae-7EAYk8

应用程序中使用的音频文件的持续时间是 00:02:54,但 NaturalDuration 属性的值是 00:01:59。

有谁知道为什么以及是否有解决方法?

提前感谢您的帮助。

4

1 回答 1

1

好的,这不是一个答案,而是一个简短调查的一些结果,这些结果提供了一些线索,为什么它会这样以及这些数字来自哪里(2:58 和 1:59)。首先看这个线程:以毫秒为单位计算 MP3 帧的长度 我们将从那里使用两件事:

1) 帧长(以毫秒为单位)=(每帧的样本数/采样率(以赫兹为单位))* 1000,并且

以秒为单位的持续时间 = 帧长度(以毫秒为单位)* 帧数 / 1000

2) 对于不同的 MPEG 版本,有一些关于样本数量的标准: 每帧样本数:

MPEG 版本 1

        384,    // Layer1
        1152,   // Layer2
        1152    // Layer3

MPEG 版本 2 和 2.5

        384,    // Layer1
        1152,   // Layer2
        576     // Layer3

现在让我们检查一下 winamp 它对文件格式信息的说明:

MPEG-2.5 第 3 层

16 kbps,2482 帧

现在,如果您采用帧 = 2482 并且每帧样本 = 576(MPEG-2.5 第 3 层),您将获得 2:58 的持续时间。但看起来出于某种原因,silverlight 和 iTunes 使用每帧样本 = 384,这给了我们 1:59。下一步可能是检查文件标头的实际值,以及它们是否正确并且可以计算正确的持续时间 - 比您可以制作一些技巧来单独获取持续时间(例如从服务器)。但我很确定 - 该文件有一些缺陷(标题和内容不一致),一些玩家可以处理它,其他人 - 不能。

于 2013-07-04T16:25:35.197 回答