[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用)

ミュージックライブラリにアクセスしてオーディオファイルを再生するにはいくつかの方法があります
• MPMusicPlayerControllerを使う
• AVAudioPlayerを使う
• AVPlayerを使う
自分が使用したことがあるのはこの3つです

MPMusicPlayerControllerを使う方法は、iPodライブラリアクセス プログラミングガイド(PDF)に記されている方法です。
iPhone OS 3.0時代から使える方法です。

AVAudioPlayer、AVPlayerを使ってミュージックライブラリにアクセスするのは、
iOS 6以降、可能になりました。(What’s New in iOS – iOS 6.0のAV Foundation Frameworkの項目を参照)

ミュージックライブラリのアイテムを再生するさいの違い

• MPMusicPlayerControllerでは、Apple Musicで「マイミュージックに追加」をしたアイテムも再生することができます。「オフラインで再生可能にする」を行っていないアイテムも再生出来ます(再生開始までにやや間がある)。このあたりの挙動は「ミュージック」アプリと同様。
ただし、ホームシェアリングのアイテムはMPMusicPlayerControllerのプレイヤーでは再生できません。

• AVAudioPlayerでは、再生速度を変更したり、ステレオ音声で音量割り振りを変えたり(パンニング)、ループ回数を指定したりできます。詳しくはAVAudioPlayer Class Referenceへ。
再生速度変更がすぐできるので、「Rendow」作成のさいに使用しました。
しかし、MPMusicPlayerControllerにくらべて再生出来るアイテムに制限があります
・クラウド上のアイテム(=端末にないアイテム)は再生できない。(購入したものでも端末に入れていないものは再生できない)
・Apple Musicで「マイミュージックに追加」したアイテムは「オフラインで再生可能にする」にしたものでも再生できません。

• AVPlayerは、動画(映像と音声)を再生できます。
AVPlayerでは、assetという単位を用います。ある動画の一部分を指定してassetとしたり、動画の一部分を複数くっつけたものをひとつのassetとして扱うことができます。
再生速度の変更ができます。
しかし、AVAudioPlayerと同様に、
・端末にないアイテム
・Apple Musicで「マイミュージックに追加」「オフラインで再生可能にする」にしたアイテム
は再生できません。


今回は、MPMusicPlayerControllerを使う方法を記します

MusicPlayerControllerを使って、ミュージックライブラリのアイテムにアクセスする

iPodライブラリアクセス プログラミングガイド(PDF)
iPod Library Access Programming Guide(英語版)
このappleのドキュメントにライブラリにアクセスして再生する方法、必要な曲を選択する方法、現在再生中の音楽の情報を知る方法等、まとめてあります。
(ちなみに、日本語ドキュメント – Apple DeveloperのページにappleのiOS用日本語ドキュメントがまとめてあります。英語版へのリンクもあります)
今回は、ミュージックライブラリから音楽を選択すると音楽がスタートするようにし、再生、一時停止、停止ができるようにします。

iOSシミュレータでは動作しないので、実機を用いてください。

Single View Applicationでプロジェクトを作成。
ss 2015-09-16 6.46.53

ViewController.SwiftにMediaPlayerフレームワークをimportします。

import UIKit
import MediaPlayer

class ViewController: UIViewController {

ボタンを配置。
ss 2015-09-13 9.08.24

ボタンとViewController.swiftをactionを作成して接続。
ss 2015-09-13 9.12.24
ss 2015-09-13 9.09.50

プレイヤーを表すpropertyをViewController.swiftに加えます。

class ViewController: UIViewController, MPMediaPickerControllerDelegate {
    
    var player = MPMusicPlayerController()

    override func viewDidLoad() {

プレイヤーのインスタンスを作成。

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        player = MPMusicPlayerController.applicationMusicPlayer()
        //player = MPMusicPlayerController.systemMusicPlayer()
        
    }

(ここで、applicationMusicPlayerではなく、systemMusicPlayerを用いると、「ミュージック」アプリでの再生状況(再生アイテムや、シャッフル、リピートなどのモード)を反映したものになる)

曲を選択するために、メディアアイテムピッカーを用います。
(メディアアイテムピッカーというのは、iOSで用意されているあらかじめ設定済みのViewController。ミュージックライブラリの選択画面と同じようなことが出来る)
ss 2015-09-13 11 41 39

メディアアイテムピッカーでの「選択完了したとき」や「キャンセルされたとき」のイベントを、ViewControllerで受け取れるようにします。
そのために、ViewControllerをメディアアイテムピッカーのデリゲートとして設定します。
「選曲」ボタンを押すと、メディアアイテムピッカーを作成して、デリゲートの設定を行い、ライブラリの曲を選択できるようにします。
「選択完了したとき」「キャンセルされたとき」のメソッドを記述します。

import UIKit
import MediaPlayer

class ViewController: UIViewController, MPMediaPickerControllerDelegate {
    @IBAction func pick(sender: AnyObject) {
        // MPMediaPickerControllerのインスタンスを作成
        let picker = MPMediaPickerController()
        // ピッカーのデリゲートを設定
        picker.delegate = self
        // 複数選択を不可にする。(trueにすると、複数選択できる)
        picker.allowsPickingMultipleItems = false
        // ピッカーを表示する
        presentViewController(picker, animated: true, completion: nil)
        
    }
    
    // メディアアイテムピッカーでアイテムを選択完了したときに呼び出される
    func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
        
        // 選択した曲情報がmediaItemCollectionに入っているので、これをplayerにセット。
        player.setQueueWithItemCollection(mediaItemCollection)
        // 再生開始
        player.play()
        // ピッカーを閉じ、破棄する
        dismissViewControllerAnimated(true, completion: nil)
        
    }
    
    
    //選択がキャンセルされた場合に呼ばれる
    func mediaPickerDidCancel(mediaPicker: MPMediaPickerController) {
        // ピッカーを閉じ、破棄する
        dismissViewControllerAnimated(true, completion: nil)
    }

各ボタンのアクションに、「再生」「一時停止」「停止」機能を加えます。

    @IBAction func pushPlay(sender: AnyObject) {
        player.play()
    }

    @IBAction func pushPause(sender: AnyObject) {
        player.pause()
    }

    @IBAction func pushStop(sender: AnyObject) {
        player.stop()
    }

iOSシミュレータでは動作しません。実機を用いてください。 「選曲」ボタンを押すと、メディアアイテムピッカーが表示され、曲を選択すると音楽がスタートします。「再生」ボタンで音楽の再生。「一時停止」ボタンで一時停止。「停止」ボタンで音楽を止めて、再生位置を一番始めに戻します。


プロジェクトはGitHubにあります。
nackpan/MPMusicPlayerControllerDemo

ViewController.swift全文

//
//  ViewController.swift
//  musicplayerDemo
//
//  Created by KUWAJIMA MITSURU on 2015/09/13.
//  Copyright (c) 2015年 nackpan. All rights reserved.
//

import UIKit
import MediaPlayer

class ViewController: UIViewController, MPMediaPickerControllerDelegate {
    
    var player = MPMusicPlayerController()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        player = MPMusicPlayerController.applicationMusicPlayer()
        //player = MPMusicPlayerController.systemMusicPlayer()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func pick(sender: AnyObject) {
        // MPMediaPickerControllerのインスタンスを作成
        let picker = MPMediaPickerController()
        // ピッカーのデリゲートを設定
        picker.delegate = self
        // 複数選択を不可にする。(trueにすると、複数選択できる)
        picker.allowsPickingMultipleItems = false
        // ピッカーを表示する
        presentViewController(picker, animated: true, completion: nil)
        
    }
    
    // メディアアイテムピッカーでアイテムを選択完了したときに呼び出される
    func mediaPicker(mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
        
        // 選択した曲情報がmediaItemCollectionに入っているので、これをplayerにセット。
        player.setQueueWithItemCollection(mediaItemCollection)
        // 再生開始
        player.play()
        // ピッカーを閉じ、破棄する
        dismissViewControllerAnimated(true, completion: nil)
        
    }
    
    
    //選択がキャンセルされた場合に呼ばれる
    func mediaPickerDidCancel(mediaPicker: MPMediaPickerController) {
        // ピッカーを閉じ、破棄する
        dismissViewControllerAnimated(true, completion: nil)
    }
    

    @IBAction func pushPlay(sender: AnyObject) {
        player.play()
    }

    @IBAction func pushPause(sender: AnyObject) {
        player.pause()
    }

    @IBAction func pushStop(sender: AnyObject) {
        player.stop()
    }



}

関連

[iOS][Swift]ミュージックライブラリの音楽の再生、情報の表示(MPMusicPlayerController使用) | nackpan Blog
[iOS][Swift]MPMediaQueryを使って曲を絞り込む | nackpan Blog
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(AVAudioPlayer使用) | nackpan Blog

「[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用)」への6件のフィードバック

  1. 非常に参考になりました。ありがとうございます!
    ボタンを配置したstoryboard上にテキストフィールドやテキストビューを配置し、そこに再生している曲のタイトルを表示するには、どうすればいいのでしょうか?

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください