AVAudioPlayer currentTime превышает длительность - PullRequest
0 голосов
/ 14 сентября 2011

Я создаю свой собственный аудиоплеер, используя AVAudioPlayer.

ПРИМЕЧАНИЕ: "p" - мой экземпляр игрока

Вот как я читаю прогресс трека на одном из ярлыков:

currentTime.text = [NSString stringWithFormat:@"%d:%02d", (int)p.currentTime / 60, (int)p.currentTime % 60];

Вот как я устанавливаю общую длительность трека в одной из меток:

int seconds = (int)p.duration % 60;
    int minutes = (int)p.duration / 60;

    duration.text = [NSString stringWithFormat:@"%d:%02d", minutes, seconds];

Когда я запускаю приложение на устройстве, текущее время дорожки ВСЕГДА превышает продолжительность (примерно на 5-10 секунд).

Это ошибка в AVAudioPlayer или я делаю это неправильно?

ПРИМЕЧАНИЕ. Такое поведение также наблюдается на устройстве (не только на симуляторе)

Ответы [ 4 ]

1 голос
/ 14 сентября 2011

Минуты должны быть плавающими: 152 seconds / 60.0f = 2.5333 , а не 2.При этом, если вы хотите показать оставшиеся минуты без секунд, которые вы уже получили: int minutes = (p.duration-seconds) / 60

Кроме того, для лучшего способа отформатировать время так, как вы хотите,взгляните на второй ответ в этом вопросе (не принятом решении).

1 голос
/ 14 сентября 2011

Найдя секунды с помощью% 60, вы должны удалить эти секунды при преобразовании оставшихся минут.Например, с общей продолжительностью 119 секунд после нахождения 59 секунд вы должны удалить это значение из 119, а затем выполнить минутное преобразование в течение 60 секунд (119-59).Это может решить вашу проблему.

0 голосов
/ 26 июля 2017
extension UILabel{

    func getTimeString(from duration:Double) -> String{

        let hours   = Int(duration / 3600)
        let minutes = Int(duration / 60) % 60

        let seconds = Int(duration.truncatingRemainder(dividingBy: 60))
        if hours > 0 {
            return String(format: "%i:%02i:%02i", arguments: [hours,minutes,seconds])
        }else {
            return String(format: "%02i:%02i", arguments: [minutes,seconds])
        }

    }
0 голосов
/ 18 мая 2017

Вот функция:

func setTimeString(duration: Double)->String {

    var audioDurationSeconds = duration
    var expression = ""
    var minutesString = "00"
    var minutesFloat = 0.0

    if (audioDurationSeconds)/60 >= 1 {

        minutesFloat = (audioDurationSeconds) / 60
        audioDurationSeconds = TimeInterval(Int(audioDurationSeconds)%60)

        if minutesFloat < 10.0 {
            minutesString = String.init(format: "0%.f", floor(minutesFloat))

        } else {
            minutesString = String.init(format: "%.f", floor(minutesFloat))
        }
    }

    if audioDurationSeconds < 10.0 {
        expression = String.init(format: "%@:0%i", minutesString, Int(audioDurationSeconds))
    } else {
        expression = String.init(format: "%@:%i", minutesString, (Int(audioDurationSeconds)))
    }

    return expression
}
...