[iOS][Swift]AVAudioPlayerを使う(リソースファイルを使う)

(2019/02/16 更新 Xcode 10.1 + Swift 4.2)

[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
では、ミュージックライブラリから取り出したアイテムを使ってAVAudioPlayerをinitializeする方法を紹介しました。
MPMediaItemからアイテムのassetURLを取得して、そのNSURLからAVAudioPlayerを作りました。

今回は、リソースファイルからAVAudioPlayerを作成する方法を紹介します。

サンプルの概要

今回使用するサンプルプログラムでは
* プロジェクトに加えておいた2種類のオーディオファイルから選択
* 選んだファイル名を表示
* 選んだファイルの再生、停止、一時停止
を行います。

ViewController.swift全文は記事の末尾にあります。

iOSシミュレータでは動作しないので、実機を用いてください。

AVAudioPlayerを使って、リソースファイルを再生する

Single View Applicationでプロジェクトを作成。
ss 2015-09-16 6.46.53

リソースファイルをプロジェクトに加える

File > Add Files To “<プロジェクト名>” から、オーディオファイルをプロジェクトに加えます。
今回は2種類使いますので、二つのオーディオファイルを加えてください。
名前は、”sound01.mp3″、”sound02.mp3″としてください。
ss 2016-02-28 0.24.17-2

UI部品レイアウト

ボタンとラベルを配置。
ss 2016-02-28 0.15.56

ラベルとViewController.swiftをOutletを作成して接続。
ss 2016-02-28 0.16.46
ss 2016-02-28 0.16.33

ボタンとViewController.swiftをActionを作成して接続。
ss 2016-02-28 0.19.19
ss 2016-02-28 0.18.31

必要なフレームワークをimport

ViewController.SwiftにAVFoundationフレームワークをimportします。

import UIKit
import AVFoundation


class ViewController: UIViewController {

プレイヤーをpropertyとして加える

プレイヤーを表すpropertyをViewController.swiftに加えます。

class ViewController: UIViewController {

    var audioPlayer:AVAudioPlayer?
    
    override func viewDidLoad() {

AVAuioPlayerは、play()やpause()などメソッドを実行する際に、urlを指定してinitializeしていないとエラーになります。
そこで、今回はAVAudioPlayer?型として宣言して初期値をnilとしています。
そしてaudioPlayerがnilの場合は、play()やpause()などを実行しないようにしています。

リソースファイルがしめすNSURLからプレイヤーを作成

「Sound01」「Sound02」ボタンを押した時の処理

「Sound01」を押したときは”sound01.mp3″で、「Sound02」ボタンを押したときは”sound02.mp3″をセットしてプレイヤーをinitializeします。

        
    
    // 「Sound01」ボタンが押されたら、プレイヤーに"sound01.mp3"をセットしてinitializeする
    @IBAction func btn01Tapped(sender: AnyObject) {
        // リソースファイル("sound01.mp3")をオーディオプレイヤーにセットしてinitializeする
        let fileName: String? = "sound01"
        let fileType:String? = "mp3"
        if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: url)
                
                // ラベル表示
                messageLabel.text = fileName
            } catch {
                // プレイヤー作成失敗
                // その場合は、プレイヤーをnilとする
                audioPlayer = nil
            }
            
        } else {
            // urlがnilなので再生できない
            fatalError("Url is nil.")
        }
    }
    
    // 「Sound02」ボタンが押されたら、プレイヤーに"sound02.mp3"をセットしてinitializeする
    @IBAction func btn02Tapped(sender: AnyObject) {
        // リソースファイル("sound02.mp3")をオーディオプレイヤーにセットしてinitializeする
        let fileName: String? = "sound02"
        let fileType:String? = "mp3"
        if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: url)
                
                // ラベル表示
                messageLabel.text = fileName
            } catch {
                // プレイヤー作成失敗
                // その場合は、プレイヤーをnilとする
                audioPlayer = nil
            }
            
        } else {
            // urlがnilなので再生できない
            fatalError("Url is nil.")
        }
    }
    

このサンプルコードでは、プレイヤーの作成が失敗した場合は、プレイヤーをnilとしています。
与えられたリソースファイルが、オーディオファイルじゃなくて画像ファイルだった、なんて場合にはプレイヤー作成が失敗します。
また、ファイル名が間違っていた場合は、URLが取得できないということで、エラーになります。

「再生」「一時停止」「停止」ボタンを押した時の処理
    @IBAction func pushPlay(sender: AnyObject) {
        // 再生
        if let player = audioPlayer {
            player.play()
        }
    }
    
    @IBAction func pushPause(sender: AnyObject) {
        // 一時停止
        if let player = audioPlayer {
            player.pause()
        }
    }
    
    @IBAction func pushStop(sender: AnyObject) {
        // 停止
        if let player = audioPlayer {
            player.stop()
        }
    }

「再生」「一時停止」「停止」ボタンで再生をコントロールできます。

ViewController.swift全文

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var audioPlayer:AVAudioPlayer?

    @IBOutlet weak var messageLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // 「Sound01」ボタンが押されたら、プレイヤーに"sound01.mp3"をセットしてinitializeする
    @IBAction func btn01Tapped(sender: AnyObject) {
        // リソースファイル("sound01.mp3")をオーディオプレイヤーにセットしてinitializeする
        let fileName: String? = "sound01"
        let fileType:String? = "mp3"
        if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: url)
                
                // ラベル表示
                messageLabel.text = fileName
            } catch {
                // プレイヤー作成失敗
                // その場合は、プレイヤーをnilとする
                audioPlayer = nil
            }
            
        } else {
            // urlがnilなので再生できない
            fatalError("Url is nil.")
        }
    }
    
    // 「Sound02」ボタンが押されたら、プレイヤーに"sound02.mp3"をセットしてinitializeする
    @IBAction func btn02Tapped(sender: AnyObject) {
        // リソースファイル("sound02.mp3")をオーディオプレイヤーにセットしてinitializeする
        let fileName: String? = "sound02"
        let fileType:String? = "mp3"
        if let url = Bundle.main.url(forResource: fileName, withExtension: fileType) {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: url)
                
                // ラベル表示
                messageLabel.text = fileName
            } catch {
                // プレイヤー作成失敗
                // その場合は、プレイヤーをnilとする
                audioPlayer = nil
            }
            
        } else {
            // urlがnilなので再生できない
            fatalError("Url is nil.")
        }
    }
    
    
    @IBAction func pushPlay(sender: AnyObject) {
        // 再生
        if let player = audioPlayer {
            player.play()
        }
    }
    
    @IBAction func pushPause(sender: AnyObject) {
        // 一時停止
        if let player = audioPlayer {
            player.pause()
        }
    }
    
    @IBAction func pushStop(sender: AnyObject) {
        // 停止
        if let player = audioPlayer {
            player.stop()
        }
    }

    

}

関連

[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
[iOS][Swift]MPMediaQueryを使って曲を絞り込む | nackpan Blog
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(再生速度の変更、複数のプレイヤー) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(複数の曲をあつかう) | nackpan Blog

投稿者:

nackpan

nackpan

iOSアプリを作っています。 リピーティングに便利な「語学学習支援プレイヤー」つくりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください