【问题标题】:AVAudioPlayer currentTime exceeds durationAVAudioPlayer currentTime 超过持续时间
【发布时间】:2011-09-14 18:08:59
【问题描述】:

我正在使用 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 中的错误,还是我做的不对?

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

【问题讨论】:

    标签: iphone time avaudioplayer duration


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      另外,要以您想要的方式格式化时间的更好方法,请查看this 问题中的第二个答案(不是公认的解决方案)。

      【讨论】:

      • 我以 mm:ss 显示格式,因此我在除法操作中丢失的剩余部分显示为使用 mod 操作获得的秒数。
      • 那么int minutes = (p.duration-seconds) / 60有什么问题?
      【解决方案3】:

      函数如下:

      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
      }
      

      【讨论】:

        【解决方案4】:
        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])
                }
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多