見出し画像

【Swift】スピーカーから音を出す方法

こんにちはシオンです!

今回は通話アプリなどでよくあるスピーカーからの音出し方法について僕が結構詰まったのでまとめました。
これは最適解というより調べながらなんとか実現した感じです。
なのでこれで実装は可能です。ただ、もっといい方法を知っている方がいれば教えていただけると幸いです。


■スピーカーから音を出す方法

手順としては
①AVFoundationをインポートする
②オーディオセッションのインスタンスを取得
③オーディオセッションの関数 (overrideOutputAudioPort)でスピーカーにする。
となります。

①AVFoundationをインポートする

import AVFoundation

②オーディオセッションのインスタンスを取得

let session: AVAudioSession = AVAudioSession.sharedInstance()

<importとインスタンスに馴染みがない人への解説>
ここまでは前準備です。
AVFoundationとはカメラの制御やオーディオの制御をしてくれる便利なクラスを持っています(横文字で言うとフレームワークというそう)。今回はその中でオーディオを制御する関数を持つAVAudiosessionというクラスを使います。

②ではオーディオを操作するために今作っているAppのオーディオ情報を取得しています。
これをインスタンスを取得するといいます。

つまり扱いやすい型はすでにswiftさんが用意してくれているので、その型に中身を流し込んでいる感じです。
(プリンを作る時にコップを用意して、その中に中身を流し込むじゃないですか?そのイメージです。コップだけじゃ何もできないし、中身だけだとコップを作るところから始めなければいけない。)

このAVAudiosessionが手順③で使う(overrideOutputAudioPort)という関数を持っています。

overrideOutputAudioPortを使って出力をスピーカーにする

ここがメインの処理です。以下コードと解説です。

//この関数を呼び出せばスピーカーになる
//例えば通話の時は通話が始まってからこの関数を呼び出す。
func speaker() {
       do {
           try session.overrideOutputAudioPort(.speaker)
       }catch{
           //エラーが起きた時の処理
           print(error)
       }
   }

<解説>
・overrideOutputAudioPort(.speaker)は音声の出力ルートを一時的に変えることができます。
・通話が始まってから呼び出す理由は通話が始まるとAudioSessionのカテゴリーやモードというのが変わってしまうからです。
・do { } catchという書き方をみたことがないという人はこちらを参考にしてみてください!

■まとめ

音をスピーカーから出すのはこれで大丈夫です。
AVAudioSessionは音声を扱う時には重宝するので今後も勉強していきます。




この記事が気に入ったらサポートをしてみませんか?