【问题标题】:How to display song currenttime and duration by using AVAudioPlayerNode如何使用 AVAudioPlayerNode 显示歌曲当前时间和持续时间
【发布时间】:2014-10-26 15:08:29
【问题描述】:

我正在使用 AVAudioPlayerNode 制作音频播放器并播放具有某些效果(延迟、音高变化、速率变化等)的歌曲,但我坚持显示歌曲当前时间和持续时间。 AVAudioPlayerNode 似乎没有像 AVAudioPlayer.currentTime 或 .duration。

如果您能帮助我使用 AVAudioPlayerNode 显示当前时间和持续时间,我将不胜感激。

【问题讨论】:

    标签: swift avfoundation avaudioplayernode


    【解决方案1】:

    目前,这是我使用的:

    - (NSTimeInterval)currentTimeInSeconds
    {
        AVAudioTime *nodeTime = self.playerNode.lastRenderTime;
        AVAudioTime *playerTime = [self.playerNode playerTimeForNodeTime:nodeTime];
    
        NSTimeInterval seconds = (double)playerTime.sampleTime / playerTime.sampleRate; 
        return seconds;
    }
    

    除了抽象时基中的渲染时间之外,播放器节点还通过playerTimeForNodeTime 提供将此时间转换为自己的播放时间线。也尊重暂停等。

    【讨论】:

    • @KeitaBickOhshiro 如果它适合您,您可以将答案标记为正确或投票以使其对其他成员可见。
    • 这给出了实际的位置,但如果你执行 AudioNode.ScheduleSegment(...) 位置不会被重置为 0,它只会继续计数。
    • 如何解决这个问题,@DanielDirtyNativeMartin。请回复
    【解决方案2】:

    这里很快:

    private func currentTime() -> NSTimeInterval {
        if let nodeTime: AVAudioTime = myAvAudioPlayer.lastRenderTime, playerTime: AVAudioTime = myAvAudioPlayer.playerTimeForNodeTime(nodeTime) {
           return Double(Double(playerTime.sampleTime) / playerTime.sampleRate)
        }
        return 0
    }
    

    只需将 myAvAudioPlayer 替换为您的 AVAudioPlayerNode!

    编码愉快!

    【讨论】:

    • 这似乎只在节点正在播放时才有效。如果停止,则返回零。
    【解决方案3】:

    AVAudioPlayerNode 期间 SWIFT 4:

    func durationOfNodePlayer(_ fileUrl: URL) -> TimeInterval {
        do {
    
            let file = try AVAudioFile(forReading: fileUrl)
            let audioNodeFileLength = AVAudioFrameCount(file.length)
            return Double(Double(audioNodeFileLength) / 44100) //Divide by the AVSampleRateKey in the recorder settings
    
           } catch {
    
              return 0
           }
    
    }
    

    【讨论】:

      【解决方案4】:

      Swift 5:

      持续时间,使用AVAudioPlayrtNodeAVAudioFile

      extension AVAudioFile{
      
          var duration: TimeInterval{
              let sampleRateSong = Double(processingFormat.sampleRate)
              let lengthSongSeconds = Double(length) / sampleRateSong
              return lengthSongSeconds
          }
      
      }
      

      根据WWDC 2014: whats new in core audio , mins 54


      然后是当前时间:

      extension AVAudioPlayerNode{
      
          var current: TimeInterval{
              if let nodeTime = lastRenderTime,let playerTime = playerTime(forNodeTime: nodeTime) {
                  return Double(playerTime.sampleTime) / playerTime.sampleRate
              }
              return 0
          }
      }
      

      感谢@Brian Becker

      【讨论】:

        【解决方案5】:

        在此期间,AVAudioFile.length 属性有效。 我将文件中的采样帧数除以采样率(44100hz)。

        对于当前时间,我暂时使用 UISlider.value 并将值与样本帧合成。

        【讨论】:

          【解决方案6】:

          这样的东西应该会给你那种能力......

          extension AVAudioPlayerNode {
              var currentTime: TimeInterval {
              get {
                  if let nodeTime: AVAudioTime = self.lastRenderTime, let playerTime: AVAudioTime = self.playerTime(forNodeTime: nodeTime) {
                      return Double(playerTime.sampleTime) / playerTime.sampleRate
                  }
                  return 0
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            • 2010-11-19
            • 2021-11-04
            相关资源
            最近更新 更多