2

AVAudioEngineが再生されたサウンドを終了したかどうかを特定する可能性はありますか? 過去に私はAVAudioPlayer's 関数を使用しました:

func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
    // Code after finished the played sound
}

ここでいくつかのエフェクトが必要ですがAVAudioEnginge、再生されたサウンドの終わりを識別する関数が提供されていません。

私はたくさん検索しましたが、残念ながら、のドキュメントでこの関数しか見つかりませんでしたAVAudioEngine:

var running: Bool { get }

私の現在の解決策は、「実行中」のブール値をチェックすることです.falseの場合、プレーヤーはもうプレイしていません。誰かがより良い解決策を知っていますかAVAudioEngine? どうもありがとうございました!

4

2 に答える 2

2

他のソリューション/デリゲートが見つからないため、NSTimerも使用しました。ただし、一度だけ起動され、オーディオファイルが終了した直後に開始されます (つまり、最初のパラメーター「seconds」には、オーディオファイルの長さの値があります)。セレクターは、私の「カスタム デリゲート」機能です。

于 2015-12-24T14:14:20.297 に答える
2

AVAudioPlayerNode をエンジンにアタッチします

player = AVAudioPlayerNode()

    let file = try! AVAudioFile(forReading: url)
    let buffer = AVAudioPCMBuffer(PCMFormat: file.processingFormat, frameCapacity: AVAudioFrameCount(file.length))

    do {
        print("read")
        try file.readIntoBuffer(buffer)
    } catch _ {
    }

engine.attachNode(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

self.player.scheduleBuffer(buffer, completionHandler: {
    print("Complete")
})

        engine.prepare()
    do {
        try engine.start()
    } catch _ {
        print("Play session Error")
    }

    player.play()

それが役立つことを願っています!

于 2015-12-29T21:18:08.510 に答える