リアルタイムに音声を処理を行う
- 入力をそのまま出力
- 入力にエフェクトをかけて出力
ソースコード
class ViewController: UIViewController {
var engine = AVAudioEngine()
override func viewDidLoad() {
super.viewDidLoad()
setupAudioSession()
let input = engine.inputNode
let output = engine.outputNode
let format = engine.inputNode.inputFormat(forBus: 0)
engine.connect(input, to: output, format: format)
try! engine.start()
}
func setupAudioSession() {
do {
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth])
try session.setActive(true)
} catch {
fatalError("Failed to configure and activate session.")
}
}
補足1
func setupAudioSession() {
do {
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth])
try session.setActive(true)
} catch {
fatalError("Failed to configure and activate session.")
}
}
これはAVAudioSession
の設定で
ステレオオーディオを録音するには、recordまたはplayAndRecordカテゴリのいずれかを使用するアプリのオーディオセッションが必要。
また、option
でiPhoneのデフォルトのスピーカーを使用することとBluetoothイヤホンで再生と録音が可能に設定。
詳しくはappleサンプルを参考にしてください!
エフェクトをかけたい場合
エフェクトをかけたい時にはノードを追加してあげると簡単にエフェクトをかけることができる。
var engine = AVAudioEngine()
var delay = AVAudioUnitDelay()
var reverb = AVAudioUnitReverb()
override func viewDidLoad() {
super.viewDidLoad()
setupAudioSession()
let input = engine.inputNode
let output = engine.outputNode
let format = engine.inputNode.inputFormat(forBus: 0)
delay.delayTime = 2.0
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
engine.attach(delay)
engine.attach(reverb)
engine.connect(input, to: delay, format: format)
engine.connect(delay, to: reverb, format: format)
engine.connect(reverb, to: output, format: format)
try! engine.start()
}
遅延を入れてリバーブをかけるとコンサートホールにいるみたいなエフェクトになった!
他にもいろいろなエフェクトが存在している。
他のエフェクト例
- AVAudioUnitDistortion
- AVAudioUnitEQ
この2つも使って音遊びをしていきたい。
まとめ
AVAudioEngineは暗黙的にinputとoutputを持っているためノードをつなげる必要性がない。
WWDC2019に新しくAVAudioEngineが新しくなったらしいので、
このセッションを復習する。