如何使用AVAudioPlayerNode显示歌曲的当前时间和持续时间

时间:2014-10-26 15:08:29

标签: swift avfoundation avaudioplayernode

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

如果您能通过使用AVAudioPlayerNode帮助我显示当前时间和持续时间,我真的很感激。

6 个答案:

答案 0 :(得分:12)

目前,这是我使用的:

- (NSTimeInterval)currentTimeInSeconds
{
    AVAudioTime *nodeTime = self.playerNode.lastRenderTime;
    AVAudioTime *playerTime = [self.playerNode playerTimeForNodeTime:nodeTime];

    NSTimeInterval seconds = (double)playerTime.sampleTime / playerTime.sampleRate; 
    return seconds;
}

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

答案 1 :(得分:3)

持续时间 AVAudioFile .length 属性有效。 我将文件中的样本帧数除以采样率(44100hz)。

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

答案 2 :(得分:3)

这是快速的:

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 :(得分:0)

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 :(得分:0)

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

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

答案 5 :(得分:0)

Swift 5:

持续时间,使用AVAudioPlayrtNode的{​​{1}}

AVAudioFile

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


然后currentTime:

extension AVAudioFile{

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

}

感谢@Brian Becker