Как отобразить текущее время и продолжительность песни с помощью AVAudioPlayerNode

Я делаю аудиоплеер, используя AVAudioPlayerNode, и играю песню с некоторым эффектом (задержка, изменение высоты тона, изменение скорости и т. Д.), Но я застрял на отображении текущего времени и продолжительности песни. AVAudioPlayerNode, кажется, не имеет, как AVAudioPlayer.currentTime или.duration.

Буду очень признателен, если вы поможете мне отобразить текущее время и продолжительность с помощью AVAudioPlayerNode.

5 ответов

На данный момент, это то, что я использую:

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

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

В дополнение к времени рендеринга в абстрактной временной базе, узел проигрывателя предлагает преобразование этого времени в собственную временную шкалу воспроизведения через playerTimeForNodeTime, Также уважает паузу и т. Д.

Вот это по-быстрому:

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!

Удачного кодирования!

Swift 5:

продолжительность, используяAVAudioPlayrtNodeс AVAudioFile

extension AVAudioFile{

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

}

по данным WWDC 2014: что нового в основном аудио, мин 54


Тогда currentTime:

extension AVAudioPlayerNode{

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

Спасибо @Brian Becker

На время 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
       }

}

Для продолжительности, свойство .length AVAudioFile работало. Я разделил количество выборочных кадров в файле на частоты дискретизации (44100 Гц).

Для текущего времени ориентировочно я использую UISlider.value и синтезирую значение с образцами кадров.

Что-то вроде этого должно дать вам эту способность...

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
    }
}
Другие вопросы по тегам