Как исчезнуть один аудио файл при воспроизведении следующего в AudioKit - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю аудиоплеер, который воспроизводит два аудиофайла. Сначала он воспроизводит один файл, затем вы можете нажать следующую кнопку, чтобы остановить воспроизведение первого и начать воспроизведение второго файла. Это хорошо работает, просто нужно позвонить 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])
    }

}
...