【Swift】ローカルに存在する音声ファイルを再生する

iOSアプリ開発で、ボタンをタップした時や特定のイベントが発生した時に「効果音」や「BGM」を鳴らしたい場面は多いですよね。
この記事では、Swiftを使ってアプリ内に保存されたローカルの音声ファイルを再生するシンプルな実装方法を解説します。

目次

動作確認環境

  • Swift 5.x
  • Xcode 14以降
  • AVFoundation フレームワークを使用

音声再生用のユーティリティクラスを作成する

音声再生には AVFoundation フレームワークの AVAudioPlayer を使用します。
どこからでも簡単に呼び出せるように、静的メソッドを持たせたユーティリティクラス(AVAudioPlayerUtil)を作成しておくと非常に便利です。

import AVFoundation

class AVAudioPlayerUtil {
    // プレイヤーのインスタンスを保持
    static var audioPlayer: AVAudioPlayer?

    /// 音声ファイルをセットして再生準備を行う
    /// - Parameter url: 音声ファイルのURL
    static func setup(url: URL) {
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer?.prepareToPlay()
        } catch {
            print("音声ファイルの読み込みに失敗しました: \(error.localizedDescription)")
        }
    }

    /// 音声を再生する
    static func play() {
        audioPlayer?.play()
    }
}

このクラスでは、指定したURLから音声を読み込む setup メソッドと、再生を実行する play メソッドを定義しています。

do-catch文を使うことで、万が一ファイルが存在しない場合やフォーマットエラーが起きた際のアプリのクラッシュを防ぎます。

再生処理を呼び出す(実行例)

次に、実際に音声を鳴らしたい場所(ViewControllerのボタンタップイベントなど)で、先ほどのユーティリティを呼び出します。

前提として、Xcodeのプロジェクトナビゲータに再生したい音声ファイル(例:sound.mp3)をあらかじめドラッグ&ドロップで追加しておいてください。

// プロジェクト内にある音声ファイルのURLを取得する
if let fileUrl = Bundle.main.url(forResource: "sound", withExtension: "mp3") {
    // 再生準備
    AVAudioPlayerUtil.setup(url: fileUrl)
    // 再生スタート
    AVAudioPlayerUtil.play()
} else {
    print("指定された音声ファイルが見つかりません")
}

Bundle.main.url を使って、プロジェクトに同梱した音声ファイルのパスを安全に取得しています。
ファイル名や拡張子のタイポ(打ち間違い)があると値が取得できないため、if let を使って安全にアンラップ(オプショナルバインディング)するのがSwiftにおけるベストプラクティスです。

まとめ

AVFoundationAVAudioPlayer を使えば、数行のコードで簡単にローカル音声ファイルの再生が可能です。

BGMのループ再生や音量調整など、より細かな制御を行いたい場合も audioPlayer インスタンスのプロパティを変更するだけで対応できるので、ぜひご自身のアプリに組み込んでみてください。

iOS/Androidに関する記事一覧

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、秋月なるです。

アラフォー会社員で、スマホアプリ/ゲーム/AIが好き。
新しいものを見ると触りたくなるタイプで、スマホやウェアラブル等ガジェットが好きですが、よく買ったあとに「思ってたのと違う…」をやりがち。

ブログ投稿は趣味の1つなので、興味があるもの全般をゆるく続けていこうと思います。

目次