18

ねえ。AVAudioEngineSwiftの新機能を使用してリアルタイム オーディオ アプリケーションを実装したいと考えています。誰かが新しいフレームワークの経験がありますか? リアルタイム アプリケーションはどのように機能しますか?

私の最初のアイデアは、(処理された) 入力データをオブジェクトに格納し、デモ クラスで確認できるように、AVAudioPCMBufferそれを で再生させることでした。AVAudioPlayerNode

import AVFoundation

class AudioIO {
    var audioEngine: AVAudioEngine
    var audioInputNode : AVAudioInputNode
    var audioPlayerNode: AVAudioPlayerNode
    var audioMixerNode: AVAudioMixerNode
    var audioBuffer: AVAudioPCMBuffer

    init(){
        audioEngine = AVAudioEngine()
        audioPlayerNode = AVAudioPlayerNode()
        audioMixerNode = audioEngine.mainMixerNode

        let frameLength = UInt32(256)
        audioBuffer = AVAudioPCMBuffer(PCMFormat: audioPlayerNode.outputFormatForBus(0), frameCapacity: frameLength)
        audioBuffer.frameLength = frameLength

        audioInputNode = audioEngine.inputNode

        audioInputNode.installTapOnBus(0, bufferSize:frameLength, format: audioInputNode.outputFormatForBus(0), block: {(buffer, time) in
            let channels = UnsafeArray(start: buffer.floatChannelData, length: Int(buffer.format.channelCount))
            let floats = UnsafeArray(start: channels[0], length: Int(buffer.frameLength))

            for var i = 0; i < Int(self.audioBuffer.frameLength); i+=Int(self.audioMixerNode.outputFormatForBus(0).channelCount)
            {
                // doing my real time stuff
                self.audioBuffer.floatChannelData.memory[i] = floats[i];
            }
            })

        // setup audio engine
        audioEngine.attachNode(audioPlayerNode)
        audioEngine.connect(audioPlayerNode, to: audioMixerNode, format: audioPlayerNode.outputFormatForBus(0))
        audioEngine.startAndReturnError(nil)

        // play player and buffer
        audioPlayerNode.play()
        audioPlayerNode.scheduleBuffer(audioBuffer, atTime: nil, options: .Loops, completionHandler: nil)
    }
}

しかし、これはリアルタイムからかけ離れており、あまり効率的ではありません。アイデアや経験はありますか?そして、Objective-C や Swift を好むかどうかは関係ありません。すべてのメモ、コメント、コメント、解決策などに感謝します。

4

4 に答える 4

6

これはあなたが望むことだと思います:https://github.com/arielelkin/SwiftyAudio

歪みをコメントアウトすると、きれいなループができます。

于 2015-06-15T15:12:53.327 に答える
2

Apple による WWDC2017のコア オーディオ ビデオの新機能 (What's New in Core Audio Video ) の約 19:20 によると、エンジニアは Swift の使用はリアルタイム コンテキストから「安全ではない」と述べています。トランスクリプトから投稿。

ここで、エンジンのレンダリングはリアルタイム コンテキストから行われるため、デモで見たオフライン レンダリングの Objective-C または Swift メタを使用することはできません。

これは、Objective-C または Swift ランタイムをリアルタイム コンテキストから使用するのは安全ではないためです。代わりに、エンジン自体がレンダー ブロックを提供します。このレンダー ブロックを検索してキャッシュし、後でこのレンダー ブロックを使用して、リアルタイム コンテキストからエンジンをレンダリングします。次に行うことは、入力ノードをセットアップして、入力データをエンジンに提供できるようにすることです。ここでは、提供する入力の形式を指定します。これは、出力とは異なる形式にすることができます。また、入力データが必要なときにエンジンが呼び出すブロックも提供します。このブロックが呼び出されると、エンジンは実際に必要な入力フレーム数を知らせます。

于 2018-07-25T19:50:28.097 に答える