Как отобразить текущее время и продолжительность песни с помощью 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
}
}