つい先日こういうのを作ったので。
せっかく作ったので、覚えてるうちに忘れないようにメモっておこうかと。
iPhoneのローカルにiTunesから同期したものを再生するための内容で、それ以外のことは書いてないです。
流れ
- プレーヤーを用意する
- プレイリストとなるキューをセット
- 再生する曲や再生位置を設定
- 再生!
です。
こういうまとまった内容が全然見つからなくて、最初は苦労しました。
ドキュメントにもちゃんと体系立てて書いておいてほしいですね・・。
プレーヤー
MPMusicPlayerController - MediaPlayer | Apple Developer Documentation
これも幾つか種類があります。
- MPMusicPlayerController.applicationMusicPlayer
- MPMusicPlayerController.systemMusicPlayer
基本的にはこのどちらかになるはずで、アプリ内でだけ独立して再生したいなら前者です。
後者の場合はシステムのプレーヤーになるので、アプリを閉じても再生が続きます。
ロック画面に出るコントローラーともつながってるし、普通に音楽プレーヤーを作るならコレですね。
再生する曲
さて、プレーヤーに再生させたい曲をどうやって調達するか。
iPhoneのローカルに入ってる曲をどうやって引っ張ってくるかです。
大きくは2つあって、
- iOSが持ってるUIを経由して取得
- コードでクエリを自力で書いて取得
前者は使ってないのでよくわかってないですが、おそらくコレ。
MPMediaPickerController - MediaPlayer | Apple Developer Documentation
これを使うとそれっぽいViewが立ち上がるはず。
後者の場合は、コードを自分で書いて取得することになるのですが、コレを使う。
自由なレイアウトで曲やアルバムを選びたい場合は、実質こっち一択です。
コードで見ると、
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
とりあえずこんなもんかなー。