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

Bic*_*ick 6 avfoundation swift avaudioplayernode

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

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

Tho*_*rer 13

目前,这是我使用的:

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

    NSTimeInterval seconds = (double)playerTime.sampleTime / playerTime.sampleRate; 
    return seconds;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这给出了实际的位置,但如果您执行 AudioNode.ScheduleSegment(...) 位置将不会重置为 0,它只是继续计数。 (2认同)

Tom*_*mte 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
}
Run Code Online (Sandbox Code Playgroud)

只需将myAvAudioPlayer替换为您的 AVAudioPlayerNode!

快乐编码!


den*_*pro 6

斯威夫特5:

持续时间,使用AVAudioPlayrtNode'sAVAudioFile

extension AVAudioFile{

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

}
Run Code Online (Sandbox Code Playgroud)

根据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
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢@布莱恩·贝克尔


Keg*_* K. 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
       }

}
Run Code Online (Sandbox Code Playgroud)


Bic*_*ick 3

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

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