2014-10-26 164 views
4

我正在制作一个使用AVAudioPlayerNode的音频播放器,播放具有某种效果(延迟,音高变化,比率变化等)的歌曲,但我一直显示歌曲电流时间和持续时间。 AVAudioPlayerNode似乎不像AVAudioPlayer.currentTime或.duration。如何使用AVAudioPlayerNode显示歌曲的当前时间和持续时间

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

回答

2

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

在当前时间,暂时我使用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它是否适合你,你可以标记的答案正确或给予好评它,使其对其他成员都看得到。 – 2014-12-16 12:48:22

+1

这给出了实际的位置,但是如果你做AudioNode.ScheduleSegment(...),位置将不会被重置为0,它只会继续计数。 – 2017-11-10 09:17:26

+0

如何解决这个问题,@DanielDirtyNativeMartin。请回复 – 2018-01-15 06:09:01

2

这是SWIFT:

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

对于AVAudioPlayerNodeSWIFT 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 
     } 

}