2015-04-29 5 views
3

Я играю песню, используя AVAudioPlayerNode, и я пытаюсь контролировать свое время, используя UISlider, но я не могу понять, как искать время, используя AVAUdioEngine.AVAudioEngine искать время песни

+1

Я ждал ответа на этот вопрос в течение нескольких месяцев и откладывал его. Я знаю, что ti включает в себя получение lastRenderTime вашего игрового узла и вычитание или добавление времени от этого. Похоже, что играть с этого времени - трудная часть. –

ответ

8

После многократного проб и ошибок, я думаю, что, наконец, понял это.

Сначала вам нужно рассчитать частоту дискретизации вашего файла. Для того, чтобы сделать это получить последнее время рендеринга вашего 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

+1

Большое вам спасибо за помощь! Я наконец понял, как все работает! – luciansvnc

+0

Без проблем, рад, что я мог бы помочь! –

+0

Откуда вы вытащили songDuration? – Ohmnastrum

1

Для будущих читателей, вероятно, лучше, чтобы получить частоту дискретизации как:

playerNode.outputFormat(forBus: 0).sampleRate

принять Также осторожность при преобразование в AVAudioFramePosition, так как это целое число, в то время как частота дискретизации равна удвоенной. Без округления результата вы можете получить нежелательные результаты.

P.S. В приведенном выше ответе предполагается, что файл, который вы играете, имеет ту же частоту дискретизации, что и выходной формат проигрывателя, что может быть или не быть правдой.

Смежные вопросы