LoginSignup
8
6

More than 5 years have passed since last update.

iOSで気軽に音をループさせる

Last updated at Posted at 2016-09-27

BGMとか環境音をループ再生させる

はじめに

BGMをずっとループして使いたいとか、効果音を指定した回数だけ繰り返して鳴らしたいとか、そう言った時に気軽に使いたいなと思い、クラス化して楽に使えるようにしました。AVAudioPlayerをもとに自分なりに扱いやすくしただけです。

準備

使いたい音源のファイルはナビーゲータエリアに追加しておく。
aif, caf, mp3, aac, m4a, mp4, wavに対応

ちなみに

ループの際、最後まで再生し終えて最初に戻る時に、若干のラグが起こることがあります。
僕の場合は環境音をずっと鳴らしたかったので困っていたんですが、ファイル形式がmp3などの圧縮したファイルの場合に起こるようでした。wavやcaf,aifの非圧縮のファイルは大丈夫!
詳しくはAVAudioPlayer gapとかでググると出て来ます。

Sound.swift

import AVFoundation

class Sound{

    //playerを作成
    var player: AVAudioPlayer!

    init(fileNamed:String,volume:Float,numberOfLoops:Int){
        let fileNameStrings = fileNamed.componentsSeparatedByString(".")
        let fileName = fileNameStrings[0]
        let fileType = fileNameStrings[1]
        let url = NSBundle.mainBundle().URLForResource(fileName, withExtension: fileType)
        if let url = url {
            do {
                player = try AVAudioPlayer(contentsOfURL: url)
                player.numberOfLoops = numberOfLoops/* 0なら一回、自然数ならその数だけループ、負の数なら永久ループ */
                player.prepareToPlay()     //再生準備 (タイミングがシビアな時のみ)
                player.volume = volume
            } catch {
                //プレイヤー作成失敗
                fatalError("Failed to initialize a player.")
            }

        } else {
            //エラーを表示させる
            fatalError("Error loading sound resource: " + fileNamed)
        }

    }

    convenience init(fileNamed:String){
        self.init(fileNamed:fileNamed,volume:1.0,numberOfLoops:0)
    }

    //AVAudioPlayerのメソッドを流用。これで〇〇.player.play()でなく〇〇.play()で済む
    func play(){
        self.player.play()
    }

    func pause(){
        self.player.pause()
    }

    func stop(){
        self.player.stop()
    }
}

使ってみる

再生とかvolumeのプロパティの扱いは基本的にはAVAudioPlayerと同じです。インスタンス化する際に少しは楽になったかと。

使用例
let bgm = Sound(fileNamed: "bgm.wav",volume:0.5,numberOfLoops:-1)
/*bgm.wavを0.5のvolumeで永久ループで再生できる*/

bgm.play()//再生
bgm.pause()//一時停止
bgm.stop()//停止

let se1 = Sound(fileNamed: "se1.wav")
/*se1.wavをvolume1.0で1回のみ再生する。*/

se1.play()//再生

終わりに

BGMとかSEつける時に使えるかなぁ。不具合とかありましたら教えてください。

8
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6