2014-10-26 1 views
4

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

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

ответ

2

На данный момент .length Недвижимость AVAudioFile Работало. Я разделил количество выборочных кадров в файле на частоту дискретизации (44100 Гц).

В настоящее время, ориентировочно, я использую UISlider.value и синтезирую значение с помощью выборочных кадров.

9

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

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

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

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

+1

@KeitaBickOhshiro, если он работает для вас, вы можете пометить ответ как правильный или upvote его, чтобы сделать его видимым для других членов. –

+1

Это дает фактическую позицию, но если вы выполняете AudioNode.ScheduleSegment (...), позиция не будет сброшена до 0, она просто продолжает подсчитываться. –

+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!

Счастливое кодирование!

0

Для продолжительности AVAudioPlayerNodeСВИФТ 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 
     } 

}