如何在播放时在标签中获取 AVAudioplayer 中的当前时间

Posted

技术标签:

【中文标题】如何在播放时在标签中获取 AVAudioplayer 中的当前时间【英文标题】:how to get current time in AVAudioplayer in a label while playing 【发布时间】:2017-03-29 23:31:21 【问题描述】:

我尝试构建一个应用程序来播放 MP3 文件。我想在播放时获取当前时间和持续时间以在 2 个标签中显示。

我使用了这个代码:

let duration = Int((player1?.duration)!)
let minutes2 = duration/60
let seconds2 = duration - minutes2 * 60
durLabel.text = NSString(format: "%02d:%02d", minutes2,seconds2) as String


let currentTime1 = Int((player1?.currentTime)!)
let minutes = currentTime1/60
let seconds = currentTime1 - minutes * 60
curLabel.text = NSString(format: "%02d:%02d", minutes,seconds) as String

持续时间显示歌曲的一半。

例如: 如果歌曲的持续时间是 20 分 40 秒,它会显示一半像 10:20。但是在当前时间没有进展的情况下,显示00:00

非常感谢。

【问题讨论】:

【参考方案1】:
    // this is to compute and show remaining time
    let duration = Int((player1?.duration - (player1?.currentTime))!)
    let minutes2 = duration/60
    let seconds2 = duration - minutes2 * 60
    durLabel.text = NSString(format: "%02d:%02d", minutes2,seconds2) as String

    //This is to show and compute current time
    let currentTime1 = Int((player1?.currentTime)!)
    let minutes = currentTime1/60
    let seconds = currentTime1 - minutes * 60
    curLabel.text = NSString(format: "%02d:%02d", minutes,seconds) as String

【讨论】:

在第一行代码有一个错误:Binary operator '-' cannot be applied to two 'TimeInterval?' (aka 'Optional<Double>') operands 作为解决方案,只需将其类型转换为Int 类似这样的let duration = Int((Int(player1!.duration) - Int(player1!.currentTime))) @Emm 你用什么类型的播放器? AVAudioPlayer 还是 AVplayer?【参考方案2】:

玩家的当前时间不会自动更新。相反,您必须使用计时器定期更新当前时间。如果您想了解更多详细信息,请查看以下主题。

check avaudioplayer's current playback time

【讨论】:

我使用的是 swift 而不是 objective-c ,任何帮助将不胜感激 我知道你在寻求 Swift 帮助,但代码是一样的。如果你有兴趣,你应该能够很容易地弄清楚。你需要知道的是,Objective-C 中的 NSTimer 在 Swift 中是 Timer。弄清楚如何转换代码应该足够简单...... 感谢您的回答,我之所以这么问是因为我是 swift 新手 我明白,但从长远来看,我给你的答案不会真正帮助你,因为你不会从中吸取教训。尝试将 Objective-C 代码转换为 Swift 并查看最终结果。如果您遇到更多问题或有其他问题,请在此处提问,我会提供帮助。 祝你好运!如果您遇到任何问题,请在此处提问或在 SO 上提出另一个问题。只要你愿意学习,人们就会帮助你:)【参考方案3】:

如果你有 Slider 在 mp3 文件上寻找,像这样:

    @IBOutlet weak var slidetOutlet: UISlider!

你可以像这样更新你的 UILabel:

     self.lblPlayerTime.text = self.secondsToHoursMinutesSeconds(seconds: Double( self.slidetOutlet.value ))

初始化你的播放器和滑块:

func playerInit()  
    guard let url = URL(string: urlAudio) else 

        return
    
    do 
        try AVAudiosession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        print("AVAudioSession Category Playback OK")
        do 
            try AVAudioSession.sharedInstance().setActive(true)
            print("AVAudioSession is Active")
            playerItem = AVPlayerItem(url: url)
            player = AVPlayer(playerItem: playerItem)

            player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main)  (CMTime) -> Void in
                if self.player!.currentItem?.status == .readyToPlay 
                    let time : Float64 = CMTimeGetSeconds(self.player!.currentTime());
                    self.slidetOutlet.value = Float ( time )
                    self.slidetOutlet.minimumValue = 0

                    let duration : CMTime = self.playerItem!.asset.duration
                    let seconds : Float64 = CMTimeGetSeconds(duration)

                    self.slidetOutlet.maximumValue = Float(seconds)
                    self.lblStartTimePlayer.text = self.secondsToHoursMinutesSeconds(seconds: seconds)

                    self.lblPlayerTime.text = self.secondsToHoursMinutesSeconds(seconds: Double( self.slidetOutlet.value ))

                
            

         catch let error as NSError 
            print(error.localizedDescription)
        
     catch let error as NSError 
        print(error.localizedDescription)
    

用于转换时间:

func secondsToHoursMinutesSeconds (seconds : Double) -> (String) 
    let (hr,  minf) = modf (seconds / 3600)
    let (min, secf) = modf (60 * minf)
    return ("\(Int(hr)):\(Int(min)):\(Int(60 * secf))")

【讨论】:

用户要求使用 AVAudioPlayer。您的代码在 AVPlayer 中

以上是关于如何在播放时在标签中获取 AVAudioplayer 中的当前时间的主要内容,如果未能解决你的问题,请参考以下文章

如何获取在 Chrome 标签中播放的音频名称

如何在python中动态显示文本时在后台播放声音?

如何在点击时在 jPlayer 中播放链接到的音频文件?

如何在应用程序处于后台模式时在 iOS 10 中播放自定义音频

摇动时在背景中播放歌曲

当应用程序在后台时在 Windows phone 8 中播放音频通知