AVFoundationで音を再生する

はじめに

iosで音を再生させる方法はいくつか存在しますが、AVFoundationを使うのが一番直感的でシンプルだと思います。

ネット上にもいくつか記事がありますがどれもカスタマイズしているものが多く、プレーンな使い方を紹介している記事が見つかりませんでした。

また、私個人的にも毎回ド忘れしてしまうのでメモとして残しておきます。

音の再生

音を鳴らすまでの手順は以下の3つです。

  1. AVAudioPlayerの操作するプロパティを作成
  2. 音声ファイルのパスをURLに変換してAVAudioPlayerを作成
  3. 使いたい場面で再生メソッドを呼び出す

AVAudioPlayerの操作するプロパティを作成

var audioPlayer: AVAudioPlayer!

音声ファイルのパスをURLに変換してAVAudioPlayerを作成

//プロジェクト内ににあるパスを参照
let path = Bundle.main.path(forResource: "ha", ofType: "mp3")
let url = URL(fileURLWithPath: path!)
try! audioPlayer = AVAudioPlayer(contentsOf: url)
//事前に一度再生をしておかないとず正しく再生されないことがあるのでこいつを呼び出しておく
audioPlayer.prepareToPlay()

使いたい場面で再生メソッドを呼び出す

audioPlayer.play()

注意点として、playを連続して呼び出している時再生中が連続で呼ぶまにクラッシュすることがあります。

なので以下のようなコードをplayの前に入れるようにしてクラッシュを防ぐのが安全です。

if audioPlayer.isPlaying {
    audioPlayer.stop()
    audioPlayer.currentTime = 0
}

画面をタップした時に音を鳴らすサンプル

import UIKit
import AVFoundation

class ViewController: UIViewController {
    var audioPlayer: AVAudioPlayer!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //プロジェクト内ににあるパスを参照
        let path = Bundle.main.path(forResource: "ha", ofType: "mp3")
        let url = URL(fileURLWithPath: path!)
        try! audioPlayer = AVAudioPlayer(contentsOf: url)
        //事前に一度再生をしておかないとず正しく再生されないことがあるのでこいつを呼び出しておく
        audioPlayer.prepareToPlay()
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        if audioPlayer.isPlaying {
            audioPlayer.stop()
            audioPlayer.currentTime = 0
        }
        audioPlayer.play()
    }
}

参考文献

CreApp iOS Swift(4.1)サンプル