MediaPlayer.seekTo的准确性(int msecs)

为什么MediaPlayer.seekTo(int msec)不准确?

有时候30秒(可变比特率和恒定比特率的mp3)! 正在寻求与audio固有问题或是这种方法被打破? 这是与缓冲或什么?

我也注意到,总的运行时间getDuration()可能是错误的(这不是一个大问题),我已经testing了getCurrentPosition()是足够准确的(如在每n秒的播放,它增加了一千)。 我在Android 2.2上。

最后,是否有人知道哪些格式,如果它实际上一贯工作(最好是除了WAV大概是这样做)?

编辑:

我主要收听播客。 即使在被转换/重新编码为CBR后,smodcast和Thinking Allowed也会出现多次问题。 这些文件没有损坏。

QuickMediaConverter(Windows)似乎工作正常,但声音转换器(Ubuntu)已经生成了一些狡猾的文件。 我会尝试坚持前…

更新:QuickMediaConverter工作得很好,但不知道为什么。 没有问题,因为!

Solutions Collecting From Web of "MediaPlayer.seekTo的准确性(int msecs)"

多媒体框架在多媒体(AV)文件上执行查找操作有两种方式。

  1. 寻find关键帧 – 编码时的video通常会有一些被称为I帧或关键帧的东西,这意味着这个帧有很多信息,可以用来完整地解码帧。 为了减less空间的数量,所有帧不被编码为关键帧,而是被编码为P(预测)帧或预测帧,意味着你可以在关键帧的帮助下解码P帧。

    所以在寻找操作期间,在这种情况下,寻找在给定的持续时间内完成到最近的关键帧。 例如,如果用户寻求40秒,并且最接近的关键帧在35秒,则寻find35秒而不是40秒。

  2. 寻求时间 – 这是寻求准确的时间,用户的要求。

    寻找仍然在最接近的关键帧完成,否则你会看到绿色补丁或video像素化是非常不可取的。 因此,对关键帧进行search,然后对帧进行解码直到需要的时间,但这些帧被丢弃并且不向用户显示。 在上面的例子中,从第35秒到第40秒的所有解码帧都被丢弃,只有超过第40秒的帧被显示给用户。

在只有audio文件的情况下可能有两种情况(如果没有parsing器或parsing器不构build时间戳表,那么 – )

  1. CBR – 恒定比特率 – 由于比特率是恒定的,我们可以跳过必要的字节数给定的时间(比特率* timeToSeek =要跳过的字节)

  2. VBR – 可变比特率 – 比特率不是恒定不变的。 因此,在这种情况下,找出文件的平均比特率,然后使用上面的方法,在这种情况下,寻找将是不准确的。

现在回到你的问题,我可以放心地告诉大家,这对大多数媒体文件来说都是正确的。

因为媒体文件本身已经损坏,所以你可能面临这样的问题的唯一原因。 (在search过程中,这只是不可能有30秒的差异,你说的是持续时间没有被正确地返回,并且没有一个mediaplayer API在Android 2.2中被破坏)

至于Android支持哪些格式,请参阅此链接

那么你可以试试另一个MP3文件?

我不知道任何关于机器人。 但我知道,在大多数媒体文件格式有一个规定,称为寻求条目或提示条目..从这里显示特定的时间,video和audio应该开始播放

如果下面的时间提示input10秒
12秒
14秒

那么如果你寻求到11秒,那么如果你寻find12秒,那么它总是会从10秒开始,然后它总是从12秒开始

为了更好地寻找文件应该与高提示input混合。