LoginSignup
63
61

More than 5 years have passed since last update.

Swiftで音楽を再生

Last updated at Posted at 2014-06-07

Swiftのお勉強がてら音楽を再生できるようにしてみました。
元記事:http://sawapi.hatenablog.com/entry/2014/06/07/023814

つくったもの

だいぶシンプルな音楽プレイヤー。
screenshot.png
iPhoneに入ってる曲を取り出してタップすると再生します。

ソースコード

ファイル構成

  • AppDelegate.swift・・・そのまま
  • ViewController.swift・・・Viewの処理
  • SongQuery.swift・・・iPhoneに入っている曲の情報を返す
  • Main.storyboard・・・NavigationControllerとTableViewおいただけ

コードの概要

曲リストの取得

func get() -> AlbumInfo[] {

    var albums: AlbumInfo[] = []

    // アルバム情報から曲を取り出す
    var albumsQuery: MPMediaQuery = MPMediaQuery.albumsQuery()
    var albumItems: MPMediaItemCollection[] = albumsQuery.collections as MPMediaItemCollection[]
    var album: MPMediaItemCollection

    for album in albumItems {

        var albumItems: MPMediaItem[] = album.items as MPMediaItem[]
        var song: MPMediaItem

        var songs: SongInfo[] = []

        var albumTitle: String = ""

        // album情報から曲リストを取得する
        for song in albumItems {

            albumTitle = song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String

            var songInfo: SongInfo = SongInfo(
                albumTitle: song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String,
                artistName: song.valueForProperty( MPMediaItemPropertyArtist ) as String,
                songTitle:  song.valueForProperty( MPMediaItemPropertyTitle ) as String,
                // NSNumberじゃないとうまくいかない
                songId:     song.valueForProperty( MPMediaItemPropertyPersistentID ) as NSNumber
            )

            songs.append( songInfo )
        }

        var albumInfo: AlbumInfo = AlbumInfo(

            albumTitle: albumTitle,
            songs: songs
        )

        albums.append( albumInfo )
    }

    return albums 
}

MPMediaQuery.albumsQuery()でアルバムのリストを取得できます。
songIdは、UInt64で動くと思ったらなぜか動かず。。NSNumberなら動きました。

選択した音楽を再生

func tableView( tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath! ) {        

    // MPMediaItemPropertyPersistentID
    // 曲を識別するID
    let songId: NSNumber = albums[indexPath.section].songs[indexPath.row].songId

    // IDからMPMediaItemオブジェクトを取得
    // SongQuery#getItemを参照
    let item: MPMediaItem = songQuery.getItem( songId )

    let url: NSURL = item.valueForProperty( MPMediaItemPropertyAssetURL ) as NSURL

    //var error: NSError? = nil

    // 再生
    audio = AVAudioPlayer( contentsOfURL: url, error: nil )
    audio.play()

    self.title = albums[indexPath.section].songs[indexPath.row].songTitle
}

MPMediaItemのvalueForPropertyメソッドはAnyObjectを返すので型変換してあげます。
AVAudioPlayerのerrorの部分にNSErrorを入れてもうまくいきませんでした。。
やり方が分かったら直します。

まとめ

Objective-C自体あまり触ったことないですが、Swiftはかなり取っ付き易いです。
あとはコード補完さえなんとかなれば。。

63
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
61