Я создаю аудиоплеер, который воспроизводит два аудиофайла. Сначала он воспроизводит один файл, затем вы можете нажать следующую кнопку, чтобы остановить воспроизведение первого и начать воспроизведение второго файла. Это хорошо работает, просто нужно позвонить AudioKit.stop()
, затем создать нового игрока, установить AudioKit.output = newPlayer
и позвонить AudioKit.start()
. Если вы не остановите AudioKit перед изменением вывода, вы получите сбой required condition is false: !destNodeMixerConns.empty() && !isDestNodeConnectedToIONode
, как я видел ранее .
Теперь вы также сможете нажать кнопку исчезновения, котораядолжна исчезнуть текущая песня на 3 секунды, но загрузитесь и начните воспроизведение следующей песни, чтобы вы могли немного послушать обе песни. Это оказывается трудным - я не уверен, как правильно его реализовать.
Мой текущий подход - создать AKPlayer
при воспроизведении песни и сохранить ее в массиве. Когда вы нажимаете fade, я создаю новый AKPlayer
для следующей песни, добавляю его в массив, устанавливаю как выход и играю. Я сделаю некоторую работу, чтобы экспоненциально уменьшить громкость первого игрока ( Cephalopod делает это очень хорошо), а затем через 3 секунды я остановлю этого игрока и уберу его из массива. Проблема, как отмечалось выше, заключается в том, что вам необходимо остановить AudioKit перед изменением выхода, что нежелательно останавливает воспроизведение первого плеера, в противном случае происходит сбой.
Как можно затухать одной песней во время воспроизведения следующей песни?
Пожалуйста, посмотрите мой пример проекта на GitHub , код которого я включил ниже:
final class Maestro: NSObject {
static let shared = Maestro()
var trackPlayers = [AKPlayer]()
let trackURLs = [
Bundle.main.url(forResource: "SampleAudio_0.7mb", withExtension: "mp3")!,
Bundle.main.url(forResource: "SampleAudio_0.4mb", withExtension: "mp3")!
]
func playFirstTrack() {
playNewPlayer(fileURL: trackURLs[0])
}
func playNewPlayer(fileURL: URL) {
let newPlayer = AKPlayer(url: fileURL)!
trackPlayers.append(newPlayer)
AudioKit.output = newPlayer //boom
do {
try AudioKit.start()
newPlayer.play()
} catch {
print("Maestro AudioKit.start error: \(error)")
}
}
func next() {
trackPlayers.forEach { $0.stop() }
trackPlayers.removeAll()
do {
try AudioKit.stop()
} catch {
print("Maestro AudioKit.stop error: \(error)")
}
playNewPlayer(fileURL: trackURLs[1])
}
func fadeAndStartNext() {
//TODO: This crashes because we change the output without stopping AudioKit
//but we can't stop playback of the first AKPlayer
//Note that the fading logic is not included here
playNewPlayer(fileURL: trackURLs[1])
}
}