MediaPlayer.seekTo的准确性(int msecs)

时间:2011-07-27 13:30:17

标签: android mp3 media-player

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

它有时提前30秒(使用可变和恒定比特率的mp3)!寻求音频固有问题还是这种方法被打破了?是缓冲还是什么呢?

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

最后,是否有人知道哪些格式实际上是一致的(最好是wav以外的其他格式)?

编辑:

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

QuickMediaConverter(Windows)似乎工作正常,但Sound Converter(Ubuntu)已生成一些狡猾的文件。我会尝试坚持前者......

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

2 个答案:

答案 0 :(得分:31)

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

  1. 寻找关键帧 - 编码时的视频通常会被称为I帧或关键帧,这意味着该帧具有大量信息,可用于整体解码帧。为了减少空间量,所有帧都不被编码为关键帧,而是将它们编码为P(预测)帧或预测帧,这意味着您可以在关键帧的帮助下解码P帧。

    因此,在搜索操作期间,在这种情况下,在给定的持续时间内对最近的关键帧进行搜索。例如,如果用户寻求40秒并且最接近的关键帧是在第35秒,则搜索到第35秒而不是第40秒。

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

    搜索仍在最近的关键帧处完成,否则您将看到视频的绿色斑点或像素化,这是非常不受欢迎的。因此,对关键帧进行搜索,然后解码帧直到所需的时间,但是这些帧被丢弃并且不向用户显示。在上面的例子中,第35秒到第40秒的所有解码帧都被丢弃,只有超过40秒的帧被显示给用户。

  3. 对于仅音频文件,可能有两种情况(如果没有解析器或解析器不构建时间戳表 - 那么

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

    2. VBR - 可变比特率 - 比特率不是恒定的,它会保持变化。所以在这种情况下,找出文件的平均比特率,然后使用上面的方法,在这种情况下,搜索将不准确。

    3. 现在回到你的问题,我可以自信地说,它运作良好,并且对大多数媒体文件都是准确的。

      您遇到此类问题的唯一原因是媒体文件本身已损坏。 (在搜索期间不可能有30秒的差异+你说的是没有正确地返回持续时间。并且没有任何媒体播放器API在Android 2.2中被破坏)

      有关Android支持的格式,请参阅此link

      那你可以试试另一个mp3文件吗?

答案 1 :(得分:0)

我对Android没有任何了解。但我知道,在大多数媒体文件格式中,有一个规定称为搜索条目或提示条目。 这个特定的时间从这里显示视频&音频应该开始播放

如果低于时间有提示输入 10秒
12秒
14秒

然后,如果你寻求11秒,那么它将始终从10秒开始      如果你寻求12秒,那么它将始终从12秒开始

更好的搜索文件应该与高提示条目复用..