(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でプロジェクトを作成。

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

UI部品レイアウト
ボタンとラベルを配置。

ラベルとViewController.swiftをOutletを作成して接続。


ボタンとViewController.swiftをActionを作成して接続。


必要なフレームワークを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