在某些音频文件上,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。
有谁知道为什么以及是否有解决方法?
在此先感谢您的帮助。
最佳答案
好的,这不是答案,而是简短调查的一些结果,这些结果提供了一些线索,为什么它会出现这种行为以及这些数字来自何处(2:58 和 1:59)。先看这个贴:Calculating the length of MP3 Frames in milliseconds
我们将从那里使用两件事:
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。下一步可能是检查文件标题的实际值,如果它们正确,并且可以计算正确的持续时间 - 比你可以编写一些技巧来单独获取持续时间(例如从服务器)。但我很确定 - 该文件有一些缺陷(不一致的标题和内容),一些玩家可以处理它,而其他人则不能。
关于silverlight - MediaElement.NaturalDuration 小于音频的实际持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470580/