在某些音频文件中,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。
有谁知道为什么以及是否有针对此的解决方法?
提前感谢您的帮助。
答案 0 :(得分:1)
好吧,这不是一个答案,而是一些简短调查的结果,它提供了一些线索,说明为什么它的行为与这些数字的来源(2:58和1:59)。首先看一下这个帖子:Calculating the length of MP3 Frames in milliseconds 我们将从那里使用两件事:
1)帧长(以ms为单位)=(每帧采样数/采样率(以hz为单位))* 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。下一步可能是检查文件头的实际值,如果它们是正确的,并且可以计算正确的持续时间 - 比你可以做一些黑客分别获取持续时间(例如从服务器)。但我很确定 - 该文件存在一些缺陷(标题和内容不一致),有些玩家可以处理,有些则没有。