AVAudioPlayer currentTime超出持续时间

时间:2011-09-14 18:08:59

标签: iphone time avaudioplayer duration

我正在使用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 个答案:

答案 0 :(得分:1)

使用%60找到秒数后,您应该在转换剩余的分钟数时删除这些秒数。例如,在找到59秒后总持续时间为119秒时,应将其从119中移除,然后进行60分钟的转换(119-59)。这可能会解决您的问题。

答案 1 :(得分:1)

分钟应该是浮动的:152 seconds / 60.0f = 2.5333 不是 2。 话虽这么说,如果你想显示余下的分钟没有你已经获得的秒数:int minutes = (p.duration-seconds) / 60

另外,为了更好地按照您想要的方式格式化时间,请查看this问题中的第二个答案(不是可接受的解决方案)。

答案 2 :(得分:0)

这是功能:

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
}

答案 3 :(得分:0)

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])
        }

    }