Android SDK MediaPlayer не ищет правильно
У меня есть mp3-файл, и мое приложение должно искать какое-то выбранное время этого mp3-файла, а затем начать воспроизведение с него.
Я конвертирую время строки этим методом в значение int
private static int convert(String time) {
int quoteInd = time.indexOf(":");
int pointInd = time.indexOf(".");
int min = Integer.valueOf(time.substring(0, quoteInd));
int sec = Integer.valueOf(time.substring(++quoteInd, pointInd));
int mil = Integer.valueOf(time.substring(++pointInd, time.length()));
return (((min * 60) + sec) * 1000) + mil;
}
Примечание: мои укусы такие 5:12.201
это означает 5 минут и 12 секунд и 201 миллисекунду.
Я получил это время от MP3 Audio Editor
приложение (это для Windows), и я проверил тему с KMPlayer
приложение (это для окон). И эти времена были правильными для них обоих.
Но в моем приложении, когда я ищу свой MediaPlayer
к тому времени звук не начинается с моей выбранной позиции. (время правильное, но звук другой.)
Я думал, что MediaPlayer
не стремится к тому времени правильно. Поэтому я проверил текущую позицию, позвонив getCurrentPosition()
перед игрой, но возвращаемое значение и искомое значение были одинаковыми.
Я понятия не имею об этом.
Редактировать:
Моя проблема не в преобразовании времени.
Я обращаюсь туда и стараюсь там правильно, но играю то, чего не ожидал в то время.
Это означает, что время в KMPlayer и Android различается.
Мой вопрос - это путь? и как это можно решить?
2 ответа
Вы должны стремиться с помощью seekTo
метод. Это ожидает миллисекунды как смещение времени. Ваше смещение - это то, как далеко от начала вы хотите играть, например, 1 минута от начала может быть вашим смещением.
Примечание: мои строки такие: 5: 12.201 (Мин . Сек. : Миллисек).
Если вы хотите искать время как 5:12.201
затем используйте seekTo(312201);
Объяснил:
1000 мсек дают одну секунду, поэтому 12000 - 12 секунд, а 60000 - одна минута.
Если ты хочешь 5m:12s
тогда делай как:
MyMins = 1000 * 60 * 5; //# 5 mins at 60 secs per minute
MySecs = 1000 * 12; //# 12 secs
MyMilliSecs = 201; //# 201 millisecs
SeekValue = (MyMins + MySecs + MyMilliSecs);
seekTo(SeekValue); //# seeks to 312201 millisecs (is == 5 min & 12 secs & 201 ms)
Я обычно использую эту функцию.
Я думаю, что это может помочь вам.
public static String milliSecondsToTimer(long milliseconds){
String finalTimerString = "";
String secondsString = "";
int hours = (int)( milliseconds / (1000*60*60));
int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
if(hours > 0){
finalTimerString = hours + ":";
}
if(seconds < 10){
secondsString = "0" + seconds;
}else{
secondsString = "" + seconds;}
finalTimerString = finalTimerString + minutes + ":" + secondsString;
return finalTimerString;
}
Удачи:)