AVAudioPlayerを使う例として
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(再生速度の変更、複数のプレイヤー) | nackpan Blog
という記事を書きました。
今回は、AVAudioPlayerで複数のアイテムを扱います。
複数のアイテムを選択したのち、順次再生されるようにしたいと思います。
サンプルプロジェクトを作りました
(プロジェクト一式はGitHubにあります nackpan/AVAudioPlayerDemo3 )

「選曲」ボタンで、複数の曲を選択し再生を開始します。
「再生・一時停止」ボタンで、再生と一時停止を切り替えます。
「<<」ボタンで前の曲に移ります。
「>>」ボタンで次の曲に移ります。
Message Labelに現在の曲情報が表示されます。
iOSシミュレータでは動作しないので、実機を用いてください。
プレイヤークラスの作成
前回までのサンプルでは、ViewController.swiftに全部書いていました。
しかし、ViewController.swiftになにもかも書いていくと、どこが何の役割なのかがわかりづらくなってしまいます。
なので、プレイヤークラスを別に作成しました。
今回のサンプルでは、SimplePlayerクラスと名付けました。
複数のアイテムを扱う
プレイヤーが、MPMediaItemの配列をもち、currentIndexで現在のindexを示すこととします。
アイテム末尾到達、「>>」ボタンタップ、「<<」ボタンタップがおこなわれると、currentIndexを変更します。
別のアイテムになるたびにプレイヤーに新アイテムをセットします。
/// プレイヤーにitemをセットして更新
func updatePlayer() {
let item = mediaItems[currentIndex]
// MPMediaItemのassetURLからプレイヤーを作成する
if let url: NSURL = item.assetURL {
do {
// itemのassetURLからプレイヤーを作成する
audioPlayer = try AVAudioPlayer(contentsOfURL: url)
// audioPlayerのdelegate先をselfに設定
// (アイテム末尾に到達したときに呼ばれるaudioPlayerDidFinishPlaying()を受ける)
audioPlayer?.delegate = self
} catch {
// エラー発生してプレイヤー作成失敗
audioPlayer = nil
// 「再生中」ではない
nowPlaying = false
// 戻る
return
}
} else {
audioPlayer = nil
// 「再生中」ではない
nowPlaying = false
}
}urlがnilのアイテムもアイテム配列に含めている
今回のサンプルでは、mediaItemsにurlがnilのMPMediaItemも含めています。
その場合のアイテム再生時には、「urlがnilなので再生できない」旨のメッセージを表示して、そこで再生を停止しています。
(実際のアプリでは、事前にチェックしてurlがnilのものを取り除いておく、あるいは再生中にnilのものがあれば飛ばすなどの処理のほうがよさそうですが…)
アイテム末尾到達を知る
AVAudioPlayerDelegateのaudioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) メソッドで知ることができます。
プレイヤーをAVAudioPlayerDelegateプロトコルに準拠させます
class SimplePlayer: NSObject, AVAudioPlayerDelegate {アイテム末尾に到達した際にaudioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool)が呼ばれるので、そこで必要な処理を行います。
このサンプルでは、
・範囲内であればindexを進めて次の曲の再生に移る
・すべてのアイテムの再生が終わったならそこで再生を終えて、indexを0に戻して最初のアイテム情報を表示する
処理を行っています。
/// アイテム末尾に到達したときに呼ばれる
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
// 最後の曲の場合は終了。そうでないなら次の曲へ
if currentIndex >= mediaItems.count - 1{
// 終了
// indexを0に戻す
currentIndex = 0
// 新たなitemでプレイヤー作成
updatePlayer()
// ポーズする
pause()
return
} else {
// 次の曲へ。
nextItem()
}
}サンプルプロジェクトのGitHub
nackpan/AVAudioPlayerDemo3
関連
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
[iOS][Swift]MPMediaQueryを使って曲を絞り込む | nackpan Blog
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog
[iOS][Swift]AVAudioPlayerを使う(再生速度の変更、複数のプレイヤー) | nackpan Blog