我正在制作一个使用AVAudioPlayerNode的音频播放器并且播放一些具有一定效果的歌曲(延迟,音高变化,速率变化等),但我仍然坚持显示歌曲的当前时间和持续时间。 AVAudioPlayerNode似乎没有像AVAudioPlayer.currentTime或.duration。
如果您能通过使用AVAudioPlayerNode帮助我显示当前时间和持续时间,我真的很感激。
答案 0 :(得分:12)
目前,这是我使用的:
- (NSTimeInterval)currentTimeInSeconds
{
AVAudioTime *nodeTime = self.playerNode.lastRenderTime;
AVAudioTime *playerTime = [self.playerNode playerTimeForNodeTime:nodeTime];
NSTimeInterval seconds = (double)playerTime.sampleTime / playerTime.sampleRate;
return seconds;
}
除了抽象时基中的渲染时间外,播放器节点还通过playerTimeForNodeTime
将此时间转换为自己的播放时间线。也尊重暂停等。
答案 1 :(得分:3)
持续时间 AVAudioFile 的 .length 属性有效。 我将文件中的样本帧数除以采样率(44100hz)。
对于当前时间,我暂时使用 UISlider.value 并将值与样本帧合成。
答案 2 :(得分:3)
这是快速的:
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!
快乐的编码!
答案 3 :(得分:0)
在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
}
}
答案 4 :(得分: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
}
}
答案 5 :(得分:0)
Swift 5:
持续时间,使用AVAudioPlayrtNode
的{{1}}
AVAudioFile
根据WWDC 2014: whats new in core audio , mins 54
然后currentTime:
extension AVAudioFile{
var duration: TimeInterval{
let sampleRateSong = Double(processingFormat.sampleRate)
let lengthSongSeconds = Double(length) / sampleRateSong
return lengthSongSeconds
}
}
感谢@Brian Becker