2011-09-14 112 views
0

我正在使用AVAudioPlayer制作自己的音频播放器。AVAudioPlayer currentTime超过持续时间

注:“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中的错误,还是我做得不正确?

注意:此行为也会发生设备(不只是在模拟器)

回答

1

通过使用60%找到秒钟后,你应该将剩余的分钟的时候,除去那些秒。例如,在找到59秒后总共持续119秒,您应该从119中删除该值,然后在60秒内进行分钟转换(119-59)。这可能会解决你的问题。

1

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

此外,为了更好的方法来格式化时间,你想要的方式,在看看第二个答案this问题(而不是接受的解决方案)。

+0

我显示格式为mm:ss因此,我要失去在除法运算余数,正在显示作为我开始使用秒mod操作。 – Sid

+0

那么'int minutes =(p.duration-seconds)/ 60'有什么问题? –

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

    } 
相关问题