IOS 本地音乐播放

概述

首先是了解一下 iPod Library Access ,知道本地音乐文件的来源。接着就是知道如何使用播放器的类实例 MPMusicPlayerController ,去播放本地的音乐文件。这样基本就可以了,为了把Apple的文档使用多一些。尝试使用 Media item picker,深入再操作一下 iPod Library.

接触的类有:

  • MPMediaItem
  • MPMusicPlayerController
  • MPMediaQuery

其他参考类

  • MPMediaGroupingAlbum
  • MPMediaLibrary

目录

使用前提醒

需要头文件

1
2
3
4
5
/**
在项目的 `General` 的 `Linked Frameworks and Libraries` 里面加入 `MediaPlayer.framework`
*/

#import <MediaPlayer/MediaPlayer.h> /* 在你需要播放器的文件里加上这个头文件 */

About iPod Library Access

如果你想播放本地的音乐,首先你要知道它存放的位置,iPod Library 就是存放它的地方。

而这个地方也是一个数据库


  • 先看图 Using iPod library access

    然后就是,我们的应用使用 Media Query 去获取 iPod Library 的音乐文件,然后应用交给 Music Player 去播放它们。

    然后在对照上图,就可以大概知道一个情况了。

    了解数据库的状态的改变,这需要 MPMediaLibraryDidChangeNotification 来作为通知。


返回的内容是一个 MPMediaItem 的数组,MPMediaItem 包含了一个媒体文件所有信息。

获取所有的音乐文件,我们还需要一个 MPMediaQuery, 这个类的实例可以用于初始化播放器的播放内容。

1
2
3
MPMediaQuery *mySong = [MPMediaQuery songsQuery]; // 这样我们就可以得到了本地音乐文件的所有内容啦

MPMediaItem *item = [mySong items][0]; // 获取本地音乐文件的第一个文件

想对 MPMediaQuery 有更多的使用有更多的了解
更多关于播放队列


Media playback

  • 播放的一些概念术语 Schematic representation of a music player object

说好的播放器,就需要一个播放器实例啦。那就是 MPMusicPlayerController.

1
2
/* 生成一个播放器的实例 */
MPMusicPlayerController *player = [MPMusicPlayerController applicationMusicPlayer];

但是,有了播放器,还需要播放的文件呢!上面我们的到了播放文件列表的一个 MPMediaQuery 实例。Just do it

1
2
3
4
5
6
[player setQueueWithQuery: [MPMediaQuery songsQuery]];
/**
或者是
[player setQueueWithQuery: mySong];

*/

还没有完哦,如果播放器的播放状态改变了,我们也需要这个消息通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
( handle_NowPlayingItemChanged: ) 和 ( handle_PlaybackStateChanged: ) 是自定义的方法。

在注销的时候,记得也把通知给注销掉哦。。。。。
*/
// now playing
[notificationCenter addObserver:self
selector:@selector(handle_NowPlayingItemChanged:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:_myPlayer];

// playback state change
[notificationCenter addObserver:self
selector:@selector(handle_PlaybackStateChanged:)
name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:_myPlayer];

[player beginGeneratingPlaybackNotifications]; // player set the notification

然后就可以开始播放了。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
遵循了 `MPMediaPlayback` Delegate,

*/
[player play]; // 播放

[_myPlayer pause]; // 暂停

[_myPlayer stop]; // 停止

[_myPlayer skipToBeginning]; // 重新开始播放

[_myPlayer skipToNextItem]; // 下一首

[_myPlayer skipToPreviousItem]; // 上一首

... (还有一些都在这个实例里面的)

到这里基本就没有了,一个简单的没有界面的播放器就完成了


更多关于 Media Query

  • Using a media query to access the device iPod library Using a media query to access the device iPod library

    上文我们得到的 MPMediaQuery 的实例 mySong.和图中的 myQuery 一样的。

media query 提供了一个对于 iPod Library 的一个搜索描述,告诉数据库如何去获取相应的 media item,并且还有如何组织这些 item

有两个配置属性

- The `filter` is the description of what to retrieve. The filter is optional; a filterless query matches the entire iPod library.

- The `grouping` type is an optional key that specifies the arrangement to use for retrieved collections of media items.

更多关于播放队列

有两种方法去设置播放的队列内容

  • Use a media item collection

    1
    2
    3
    4
    /**
    musicPlayer 是 MPMusicPlayerController 的实例
    */
    [musicPlayer setQueueWithItemCollection: userMediaItemCollection];
  • Use a media query, which implicitly defines a collection

    1
    2
    3
    4
    /**
    musicPlayer 是 MPMusicPlayerController 的实例
    */
    [musicPlayer setQueueWithQuery: [MPMediaQuery songsQuery]];

更多关于使用iPod Library

  • 如何使用更好的使用iPod Library Using the iPod library database access classes
    参考官方文档

关于如何使用item picker

  • 使用 Item Picker  The user interface of the media item picker

Using the Media Item Picker


参考链接信息

iPod Library Access Programming Guide

Media Player Framework Reference

MPMusicPlayerController

MPMediaPlayback

MPMediaLibrary