🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

SwiftでiOS向け音楽プレーヤーを作るための基礎知識

GitHub - leader22/SimpleMusicPlayer: SMP!


つい先日こういうのを作ったので。
せっかく作ったので、覚えてるうちに忘れないようにメモっておこうかと。

iPhoneのローカルにiTunesから同期したものを再生するための内容で、それ以外のことは書いてないです。

流れ

  • プレーヤーを用意する
  • プレイリストとなるキューをセット
  • 再生する曲や再生位置を設定
  • 再生!

です。
こういうまとまった内容が全然見つからなくて、最初は苦労しました。
ドキュメントにもちゃんと体系立てて書いておいてほしいですね・・。

プレーヤー

MPMusicPlayerController - MediaPlayer | Apple Developer Documentation

これも幾つか種類があります。

  • MPMusicPlayerController.applicationMusicPlayer
  • MPMusicPlayerController.systemMusicPlayer

基本的にはこのどちらかになるはずで、アプリ内でだけ独立して再生したいなら前者です。

後者の場合はシステムのプレーヤーになるので、アプリを閉じても再生が続きます。
ロック画面に出るコントローラーともつながってるし、普通に音楽プレーヤーを作るならコレですね。

再生する曲

さて、プレーヤーに再生させたい曲をどうやって調達するか。
iPhoneのローカルに入ってる曲をどうやって引っ張ってくるかです。

大きくは2つあって、

  • iOSが持ってるUIを経由して取得
  • コードでクエリを自力で書いて取得

前者は使ってないのでよくわかってないですが、おそらくコレ。

MPMediaPickerController - MediaPlayer | Apple Developer Documentation

これを使うとそれっぽいViewが立ち上がるはず。
後者の場合は、コードを自分で書いて取得することになるのですが、コレを使う。

自由なレイアウトで曲やアルバムを選びたい場合は、実質こっち一択です。

MPMediaQuery - MediaPlayer | Apple Developer Documentation

コードで見ると、

let player = MPMusicPlayerController.systemMusicPlayer()
let query  = MPMediaQuery.songsQuery()

player.setQueueWithQuery(query)

こういう感じ。

  • songsのQuery以外に、albumsのQueryとかもある
  • `addFilterPredicate()`なるメソッドで、フィルタを追加したりできる

なんしかこれで、再生したい曲(1曲かもしれないし、いっぱいあるかもしれない)をプレーヤーに認識させられました。

再生する

ここまでくるとあとは簡単。

player.play()

イメージ通りですね。
10曲のアルバムをクエリでセットしてて、2曲目から再生したいみたいな場合は、

// 2曲目をセットしてから
player.nowPlayingItem = query.items![1]
player.play()

あとのこともコードで。

// 再生位置
player.currentPlaybackTime = 3

// リピート設定
player.repeatMode = .All

// シャッフル
player.shuffleMode = .Off

// 先頭・前・次
player.skipToBeginning()
player.skipToPreviousItem()
player.skipToNextItem()

再生位置はプレーヤーにあるので、曲を送るのではなく直再生する場合は`0`に戻さないと途中から再生されちゃう。

そのほか

  • MPMusicPlayerControllerPlaybackStateDidChange
  • MPMusicPlayerControllerNowPlayingItemDidChange
  • MPMusicPlayerControllerVolumeDidChange

という3つのイベント通知を受けることができます。

  • 止まった・再生したなどの再生状況
  • 再生中の曲の状況
  • 音量の状況

もちろんこの通知を待たなくても、自分から状況を取りに行くこともできます。
なんかイベントが挙動不審だみたいな記事を見たような気がしないでもないので、そこは一応・・。

おわりに

音を出すという意味では、もっとローレベルなクラスもあるっぽいです。

AVAudioPlayer - AVFoundation | Apple Developer Documentation

とりあえずこんなもんかなー。