6

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

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

4

6 回答 6

14

目前,这是我使用的:

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

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

除了抽象时基中的渲染时间之外,播放器节点还通过playerTimeForNodeTime. 也尊重暂停等。

于 2014-12-11T14:39:09.783 回答
8

这里是迅速的:

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!

快乐编码!

于 2016-02-18T18:50:39.780 回答
5

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
       }

}
于 2017-10-29T19:36:06.907 回答
4

斯威夫特 5:

持续时间,使用AVAudioPlayrtNode'sAVAudioFile

extension AVAudioFile{

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

}

根据WWDC 2014:核心音频的新功能,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

于 2019-10-06T09:02:07.207 回答
3

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

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

于 2014-11-03T07:10:30.570 回答
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
    }
}
于 2018-08-24T19:31:44.990 回答