Я играю песню с помощью AVAudioPlayerNode
и пытаюсь контролировать ее время с помощью UISlider
, но не могу понять, как искать время с помощью AVAUdioEngine
.
AVAudioEngine ищет время песни
Ответы (2)
После МНОГО проб и ошибок я думаю, что наконец понял это.
Сначала вам нужно рассчитать частоту дискретизации вашего файла. Для этого получите время последнего рендеринга вашего AudioNode:
var nodetime: AVAudioTime = self.playerNode.lastRenderTime
var playerTime: AVAudioTime = self.playerNode.playerTimeForNodeTime(nodetime)
var sampleRate = playerTime.sampleRate
Затем умножьте частоту дискретизации на новое время в секундах. Это даст вам точный кадр песни, с которого вы хотите запустить проигрыватель:
var newsampletime = AVAudioFramePosition(sampleRate * Double(Slider.value))
Далее вы захотите подсчитать количество кадров, оставшихся в аудиофайле:
var length = Float(songDuration!) - Slider.value
var framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)
Наконец, остановите свой узел, запланируйте новый сегмент аудио и снова запустите свой узел!
playerNode.stop()
if framestoplay > 1000 {
playerNode.scheduleSegment(audioFile, startingFrame: newsampletime, frameCount: framestoplay, atTime: nil,completionHandler: nil)
}
playerNode.play()
Если вам нужны дополнительные пояснения, я написал краткое руководство здесь: http://swiftexplained.com/?p=9 а>
playerNode.outputFormat(forBus: 0).sampleRate
- person hhanesand; 28.10.2017
Для будущих читателей, вероятно, лучше получить частоту дискретизации как:
playerNode.outputFormat(forBus: 0).sampleRate
Также будьте осторожны при преобразовании в AVAudioFramePosition, так как это целое число, а частота дискретизации — двойная. Без округления результата вы можете получить нежелательные результаты.
P.S. Приведенный выше ответ предполагает, что воспроизводимый файл имеет ту же частоту дискретизации, что и выходной формат проигрывателя, что может быть правдой, а может и нет.
playerNode.stop()
ПЕРЕД вызовом метода playerNode.scheduleSegment()
, и тогда он воспроизводится. Я пропустил вызов playerNode.stop()
, потому что хотел запустить звуковую дорожку в указанное время. Вау! Какое фиаско с моей стороны! Спасибо за пример кода!
- person SouthernYankee65; 13.09.2020