使って創ってApp

ソフトウェアを使ったり作ったりするブログです

iOSアプリ開発で音声ファイルを再生・一時停止する方法

iOS アプリ開発で音声ファイルを使用することがあると思います。そこで、音声ファイルを扱う上で基本的な再生と一時停止をしてみましょう。

Udemy の講座「 完全攻略!初心者からプロになるためのiOS 9アプリ開発のすべて」 でレクチャー79(音声の再生・一時停止・リスタート)の内容です。

www.udemy.com

開発環境

音声再生

音声を再生するには AVFoundation フレームワークを使用します。これは音楽や映像に関する機能を使えるようにするフレームワークです。これを使うと、簡単に再生や一時停止ができます。

サンプルアプリケーション

今回は、「5秒ごとに再生と一時停止を交互に繰り返す」アプリを作成します。こんなアプリで音楽聴きたくないですね。以下の順番でアプリを作ります。

  1. プロジェクトを作成する
  2. AVFoundation フレームワークを読み込む
  3. 音声ファイルを読み込む
  4. AVAudioPlayer クラスのインスタンスを作成
  5. 5秒ごとに再生と一時停止を繰り返させる

1. プロジェクトを作成する

Xcode を立ち上げ、新規プロジェクトを作成します。テンプレートは Single View Application を選択し、プロジェクト名は Demo_Audio にしました。

2.  AVFoundation フレームワークを読み込む

ここから先はコードを追加する際、ViewController.swift に追加していきます。

import UIKit
import AVFoundation // 追加

最初からある import UIKit の下に import AVFoundation を追加しました。これで AVFoundation クラスの機能を使えるようになります。

3.  音声ファイルを読み込む

まずはプロジェクトに音声ファイルを追加します。Project Navigator に音声ファイルをドラッグアンドドロップします。

f:id:hitxutokun:20151221232810p:plain

この時、追加オプションで Add to targets にチェックを入れてください。入れないと、プログラムからファイルを読み込めません。

f:id:hitxutokun:20151221233013p:plain

追加したファイルのパスを取得しましょう。以下のコードを viewDidLoad に追加します。

let url = NSBundle.mainBundle().URLForResource("1億5千万の奇跡", withExtension: "m4a")!

URLForResource メソッドの引数には、あなたが追加したファイルの名前と拡張子を書いてください。

4. AVAudioPlayer クラスのインスタンスを作成

AVAudioPlayer クラスは、音声ファイルを再生・一時停止や音量・現在の再生時間などを扱うクラスです。まず AVAudioPlayer のインスタンスを格納する変数を宣言します。クラス内で使い回すので、クラス宣言の下に書きます。

class ViewController: UIViewController {
  var player = AVAudioPlayer()

以下のコードを 3 で入力したコードの下に入力します。

let url = ~~~~
do {
  player = try AVAudioPlayer(contentsOfURL: url)
} catch let err as NSError { // エラー処理
  print(err.localizedDescription)
}

この時点で player = try ~~ の下に player.play() と書けば、音声ファイルが再生されるはずです。

5.  5秒ごとに再生と一時停止を繰り返させる

再生と一時停止を切り替える関数を作り、その関数を5秒ごとに呼び出します。

AVAudioPlayer のインスタンスは、自身が音声を再生しているか停止しているかを知る playing プロパティを持っています。このプロパティを利用して、関数を作ります。viewDidLoad メソッドと didReceiveMemoryWarning メソッドの間にでも書きましょう。

func playOrStop() {
  if player.playing {
    player.pause()
  } else {
    player.play()
  }
}

player(AVAudioPlayer クラスのインスタンス) に play() や pause() メソッドを呼ぶだけで、再生・一時停止ができます。とても簡単ですね。

一定間隔で関数を実行するには NSTimer クラスを使用します。NSTimer は Swift 2.1 タイマーを使う - 使って創ってApp でも使いました。

以下のコードを 4で書いた player = try~~~ の下に書きます。

player = try ~~~
NSTimer.scheduledTimerWithTimeInterval(
  5,
  target: self,
  selector: Selector("playOrStop"),
  userInfo: nil,
  repeats: true
)

これで完成です!シミュレータで実行すると、5秒ごとに再生・一時停止が切り替わりますか?

まとめ