我正在使用 AVAudioPlayerNode 制作音频播放器并播放具有某些效果(延迟、音高变化、速率变化等)的歌曲,但我坚持显示歌曲当前时间和持续时间。AVAudioPlayerNode 似乎没有像 AVAudioPlayer.currentTime 或 .duration。
如果您能帮助我使用 AVAudioPlayerNode 显示当前时间和持续时间,我将不胜感激。
我正在使用 AVAudioPlayerNode 制作音频播放器并播放具有某些效果(延迟、音高变化、速率变化等)的歌曲,但我坚持显示歌曲当前时间和持续时间。AVAudioPlayerNode 似乎没有像 AVAudioPlayer.currentTime 或 .duration。
如果您能帮助我使用 AVAudioPlayerNode 显示当前时间和持续时间,我将不胜感激。
目前,这是我使用的:
- (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!
快乐编码!
在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
}
}
斯威夫特 5:
持续时间,使用AVAudioPlayrtNode
'sAVAudioFile
extension AVAudioFile{
var duration: TimeInterval{
let sampleRateSong = Double(processingFormat.sampleRate)
let lengthSongSeconds = Double(length) / sampleRateSong
return lengthSongSeconds
}
}
然后当前时间:
extension AVAudioPlayerNode{
var current: TimeInterval{
if let nodeTime = lastRenderTime,let playerTime = playerTime(forNodeTime: nodeTime) {
return Double(playerTime.sampleTime) / playerTime.sampleRate
}
return 0
}
}
谢谢@Brian Becker
在此期间,AVAudioFile的.length属性有效。我将文件中的样本帧数除以采样率(44100hz)。
对于当前时间,我暂时使用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
}
}