Ответ 1
Существует два способа, которыми мультимедийная инфраструктура выполняет операцию поиска в мультимедийном (AV) файле.
-
Ищите ключевой кадр. Видео при кодировании обычно имеет что-то, называемое I-фреймом или фреймом Key, это означает, что этот кадр имеет много информации и может использоваться для полного декодирования кадра. Чтобы уменьшить объем пространства, все кадры не кодируются как ключевые кадры, а они кодируются как P (предсказанные) кадры или предсказанные кадры, что означает, что вы можете декодировать P-кадр с помощью ключевого кадра.
Таким образом, во время операции поиска в этом случае поиск выполняется для ближайшего ключевого кадра для заданной продолжительности времени. Например, если пользователь ищет 40 секунд и ближайший ключевой кадр находится на 35-й секунде, поиск производится до 35-й секунды, а не до 40-й секунды.
-
Ищите время - это поиск точного времени, которое требует пользователь.
Поиск по-прежнему выполняется в ближайшем ключевом кадре, поскольку в противном случае вы увидите зеленые патчи или пиксели видео, что крайне нежелательно. Таким образом, поиск выполняется для ключевого кадра, а затем кадры декодируются до требуемого времени, но эти кадры отбрасываются и не отображаются пользователю. В приведенном выше примере все декодированные кадры с 35-го по 40-й секунды отбрасываются и отображаются только кадры за 40 секунд.
В случае только аудиофайлов могут быть два случая (если нет синтаксического анализатора или синтаксического анализатора, который не создает таблицу времени, тогда -)
-
CBR - постоянная скорость передачи битов - поскольку скорость бит постоянна, мы можем пропустить необходимое количество байтов в заданное время (битрайт * timeToSeek = байты, которые нужно пропустить)
-
VBR - переменная скорость передачи битов - скорость передачи битов не постоянна, она меняется. Таким образом, в этом случае найдите средний битрейт файла, а затем используйте вышеуказанный метод, в этом случае поиск будет неточным.
Теперь, вернувшись к вашему вопросу, я могу с уверенностью сказать, что он работает хорошо и точно для большинства медиафайлов.
Единственная причина, по которой вы столкнулись с такими проблемами, состоит в том, что медиафайл сам по себе поврежден. (Просто невозможно иметь разницу в 30 секунд во время поиска +, вы говорите, что продолжительность не верна правильно. И ни один из API медиаплеер не работает для Android 2.2)
Что касается форматов, поддерживаемых Android, см. ссылку
Так вы можете попробовать с другим mp3 файлом?