银光媒体播放器位置问题

6
我遇到了一个奇怪的问题。我的应用程序从特定位置播放电影,因此即使以毫秒为单位的位置也很重要。我将位置分配给媒体元素,但它显示错误的帧。我不知道为什么媒体播放器没有从我给出的位置播放。
以下是一些示例代码:
 TimeSpan oTimeSpan = TimeSpan.FromMilliseconds(16800200); // This shows 04:40:00.2000000

 MediaPlayer.Position = oTimeSpan;      // But after assigning, value is 04:40:00.1990000

在分配之前和之后,这里有一张截图:

alt text

alt text

有人能告诉我我在这里做错了什么吗?


你确定显示了错误的帧,有一个在200毫秒和另一个在199毫秒的帧? - AnthonyWJones
我更关心的是 04:40:00.2000000 是如何转换为 04:40:00.1990000 的? - Singleton
这也可能是由于播放时使用的特定编解码器只能定位到帧起始位置。在我所做的一些工作中,我有一个编解码器只能定位到关键帧(在我的情况下导致定位偏差高达一秒钟)。我通过使我的界面响应播放器所说的我的位置来处理它,即使告诉它我想去哪里。 - Duane
2个回答

3

虽然在这种情况下您可能会关注小数毫秒差异,但您必须记住视频每约33毫秒(使用标准NTSC 29.97 FPS)才会有一帧。因此,除非您进行取证级别的分析(在这种情况下,MediaPlayer不是正确的工具),否则这比您需要的精度更高。

由于TimeSpan在内部使用Int64,因此不应该存在任何舍入问题,我猜测MediaPlayer正在捕捉最接近的可用视频帧。


这也是我的评估,视频播放器的属性显示当前帧的时间标记,它不一定与传递给它的时间跨度相同,因为可能没有在那个精确的毫秒数开始的帧。 - EtherDragon

1

尽管 timespan 以整数形式公开其属性,但我怀疑它在内部使用浮点值。这种问题是由于浮点值存储方式导致的。

你是否尝试过检查从 TimeSpan.Equals(MediaPlayer.Position, oTimeSpan) 得到的结果?我认为这将表明它们是相等的。


它以Int64形式存储为ticks,并根据需要进行转换。 - Duane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接