Я играю песню, используя AVAudioPlayerNode
, и я пытаюсь контролировать свое время, используя UISlider
, но я не могу понять, как искать время, используя AVAUdioEngine
.AVAudioEngine искать время песни
ответ
После многократного проб и ошибок, я думаю, что, наконец, понял это.
Сначала вам нужно рассчитать частоту дискретизации вашего файла. Для того, чтобы сделать это получить последнее время рендеринга вашего 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
Большое вам спасибо за помощь! Я наконец понял, как все работает! – luciansvnc
Без проблем, рад, что я мог бы помочь! –
Откуда вы вытащили songDuration? – Ohmnastrum
Для будущих читателей, вероятно, лучше, чтобы получить частоту дискретизации как:
playerNode.outputFormat(forBus: 0).sampleRate
принять Также осторожность при преобразование в AVAudioFramePosition, так как это целое число, в то время как частота дискретизации равна удвоенной. Без округления результата вы можете получить нежелательные результаты.
P.S. В приведенном выше ответе предполагается, что файл, который вы играете, имеет ту же частоту дискретизации, что и выходной формат проигрывателя, что может быть или не быть правдой.
- 1. AVAudioEngine AudioFile Time Management
- 2. Воспроизведение песни во время разговора
- 3. Python: время смещения песни (bpm)
- 4. Есть ли способ искать в настоящее время песни для каждого пользователя с помощью Spotify API?
- 5. Искать время в MySQL
- 6. Получение времени работы процессора AVAudioEngine
- 7. Как получить время прослушивания MPMediaItem (песни)
- 8. Чтение Время/Продолжительность песни Mp3 в Java
- 9. Воспроизведение песни с компьютера во время работы
- 10. ios время растяжения песни из библиотеки ipod
- 11. Как отображать текущее время песни в TextView?
- 12. Воспроизведение песни во время работы приложения
- 13. AVAudioEngine отдельные каналы
- 14. AVAudioEngine прогресс трек аудио
- 15. AVAudioEngine low volume
- 16. AVAudioEngine downsample issue
- 17. AVAudioEngine Microphone Float Data
- 18. AVAudioEngine воспроизведение многоканальный аудио
- 19. Воспроизведение музыкиSequence на AVAudioEngine
- 20. Имея AVAudioEngine, повторите звук
- 21. AVAudioEngine() Воспроизведение не работает
- 22. AVAudioEngine with Today Extension
- 23. AVAudioEngine падает, когда я отключаю наушники во время разговора
- 24. Android - получите в настоящее время длительность песни и прошедшее время
- 25. AVAudioEngine: Запуск набора AVAudioPlayerNodes сразу
- 26. AVAudioFile не воспроизводится в AVAudioEngine
- 27. Подробная информация об использовании AVAudioEngine
- 28. Воспроизведение песни после завершения песни Javascript
- 29. fade in/out с AVAudioEngine
- 30. AVAudioEngine inputNode call throws error
Я ждал ответа на этот вопрос в течение нескольких месяцев и откладывал его. Я знаю, что ti включает в себя получение lastRenderTime вашего игрового узла и вычитание или добавление времени от этого. Похоже, что играть с этого времени - трудная часть. –