About iPod Library Access

关于iPod库访问

iPod library access 是检索和播放从设备的iPod库中获取的项目的iOS界面。iPod库是设备上媒体项的集合。这些媒体项是用户从iTunes上同步过来的。

如 图 1-1 所示, 应用程序有两种方式取得项目。媒体选择器,显示在左侧,是一个易于使用的、封装的视图控制器。它的行为类似一个iPod应用程序内置的音乐选择接口。 对于很多应用程序来说,这就足够了。

如果你想要选择器没有提供的专业的访问控制,则媒体查询接口(显示在图的右下方)将提供。 它提供基于断言的从设备iPod库中获取的项的说明。


图 1-1  使用iPod库访问

如图中应用程序的右侧所示,你可以用这个API提供的播放器播放取得的媒体项。

如你所见,在这个API中这些类有两种处理方式,通常的开发区域:数据库访问——找到媒体项用于播放——和音乐播放。然而,你不需要在两个区域中利用专门的主题去直接使用这个API。iPod库访问为你做了这个“重任”。

举个例子,你的全部音乐播放代码只有一行——无论是播放DRM-encrypted AAC文件、来自于CD的苹果无损格式、用iLBC编码的博客、或是有声书。系统自动设置缓存,选择适当的编×××,并直接发送音频到设备输出硬件。

使用音乐播放器和媒体项目选择器,你能够实现音乐的选择和播放而无需去编写任何代码去访问iPod库。当你需要它的时候,数据库访问类会提供完整的查询系统,而当你不需要的时候,它则不会出现。

Note: iPod库访问仅适用于音频媒体项目。不能播放iPod库里的视频博客、电影或是电视。


About Music Players

关于音乐播放器


你的应用程序使用音乐播放器就类似于最终用户操作内置的iPod应用程序。你能通过编程的方式进行播放、暂停、查找等。

音乐播放器的基础和术语


音乐播放器 用来播放媒体项目的对象。它有一个播放队列, 播放队列是一个需播放媒体项的列表。媒体项可以是歌曲、博客,或者有声书。

用户从iTunes同步时获取媒体项到设备中。在设备中,所有的媒体项被称为iPod库。

音乐播放器知道哪个项正在被播放或是被指定播放,并且知道项要被播放的时间轴上的位置。这些属性的概要描述见 图 1-2. (这个图只是用于解释。音乐播放器不提供用户界面。)

图 1-2  音乐播放器对象示意图

现在播放 项有特别的状态。例如,如果用户在内置的iPod应用程序上暂停一首歌, 然后启动你的应用程序,你的音乐播放器能从相同的点继续播放这个项目。

围绕音乐播放器的附加属性,使它具有高度的灵活性。如图所示,音乐播放器具有模式、播放状态和音量等属性。

随机播放模式重复播放模式 操作和内置的iPod应用程序一样。

播放状态 是你从音频播放系统想要得到的:播放、停止、暂停、快进、或快退。另外,你可以跳到下一个媒体项的开头或是回到播放队列的开头。

音量 默认状态下是满值,并且可以设置任何的的值包括静音。


你可以设置两种风格的音乐播放器,这取决于你想让应用程序达到何种目标。

应用程序音乐播放器 播放应用程序本地的音乐。 它不受、也不影响内置的iPod应用程序。具体来说,你的音乐播放器具有不同的正在播放项、播放状态和模式。当用户退出应用程序的时候,音乐随之停止。

iPod 音乐播放器,事实上,它采用的是内置的iPod应用程序。当用户退出应用程序时,音乐继续播放。


最后,记住下面两个关于使用音乐播放器的重要事项:

同一时间只能有一个音乐播放器运行。

音乐播放器只能在你的应用程序的主线程上使用。


你好,音乐播放器


这是一个极简单的示例,hello world,这个示例演示了库访问和音乐播放。几分钟后,你将有一个能工作的音乐播放器。这个代码排列了整个iPod库并且在程序启动后立即播放。

Note: 接下来的步骤你需要一个真机。因为虚拟机不提供iPod库访问。


1.创建一个新的Xcode项目,使用应用程序模板窗口创建一个新的项目。在项目窗口,添加 MediaPlayer 框架到框架组。 保存项目。

2.包含Media Player 框架的头文件,AppDelegate.h 文件添加, #import <MediaPlayer/MediaPlayer.h>。

3.添加代码创建一个音乐播放器, 分配要播放的音乐并开始播放。打开工程的 AppDelegate.m 实现文件。 在 applicationDidFinishLaunching: 代码块结束前, 添加三行如 代码清单 1-1 所示的代码.

代码清单 1-1  极简单的音乐播放器

// instantiate a music player

MPMusicPlayerController *myPlayer =

  [MPMusicPlayerController applicationMusicPlayer];

// assign a playback queue containing all media items on the device


[myPlayer setQueueWithQuery: [MPMediaQuery songsQuery]];

// start playing from the beginning of the queue
[myPlayer play];

现在,为你的开发设备配置恰当的工程,其中包括设置代码代码签名身份(code-signing identity)和束标示符。同时确保设备中至少有一首歌在iPod库中。构建并运行项目。当应用程序在设备上启动的时候,iPod库中得第一首歌就开始播放。音乐播放器会一直播放iPod库里面的个所有项目直到你退出应用程序。

About Music Player Change Notifications

关于音乐播放器改变的通知


想要保持对音乐播放器正在做的事进行跟踪,你要注册音乐播放器改变的通知。这对于确保应用程序的状态和音乐播放器的状态的协调至关重要。

举个例子,下面是正常启动音乐播放器的事件顺序。注意,因为音乐播放器在它自己的线程上操作,所以在接收到相应的通知之前,你不能更新你的用户界面。

1.用户点击播放按钮。

2.应用程序调用音乐播放器进行播放。

3.音乐播放器开始播放,且发送一个回放状态改变的通知。

4.应用程序接受这个通知,并且查询播放器的状态,确认它是否真的在播放。

5.应用程序更新相应的用户界面——或许是改变播放按钮为暂停按钮。


音乐播放器改变通知支持跟踪播放状态、正在播放的项目、和音乐播放器的播放音量。 “Using Media Playback” 解释了如何使用它们。

Home Sharing and iPod Music Players

家庭共享和iPod音乐播放器


从iOS 4开始,内置iPod和视频应用程序能够播放来自使用家庭共享库中的媒体。然而,第三方应用程序使用Media Player 框架仍然只能访问设备中的iPod库。这意味着你的应用程序不能在你的用户界面显示家庭分享歌曲的标题。但是,当播放共享媒体时,其他播放信息——例如当前的播放时间和播放状态——是显示的。

About Media Items and the iPod Library

关于媒体项目和iPod库

媒体项目——在iPod库中的歌曲、有声书、和播客——能拥有广泛的元数据。你能使用这些元数据构建查询或是在用户界面上创建有吸引力的媒体项显示。图 1-3 给你一个媒体项特性的例子。

图 1-3  媒体项和它的一些元数据

所有媒体项元数据都是只读的。然而,通过媒体项固有的ID值,你能够联合使用你所管理的应用程序的额外元数据。

如图 1-3 所示的,一个项的元数据恩能够包括多个类别的信息。所以被称作一般属性是那些能够适用于所有媒体项的属性。包括“标题”、“艺术家”、“插图”等等。这些属性的值通常不随时间改变。

一个媒体项也能有用户自定义属性,例如评级和最后播放日期。这些属性根据用户的活动进行更新,就像在桌面上操作一样。

The Media Item Picker

媒体项选择器


用户选择音乐的最简单方法是使用media item picker——一个全配制模式视图控制器。它的用户界面是类似于内置iPod应用程序活跃时的界面,如 图1-4 所示。

图 1-4  媒体项选择器的用户界面

当用户点击完成时,一个你才实现的代理方法接收选择的媒体项形成的列表,然后将选择器视图不显示。

一定要知道,媒体项选择器和内置iPod应用程序之间的相似只是一种表面现象。使用iPod,用户能够构建一个活跃的播放列表。这个播放列表的行为就像其他的播放列表。举个例子,它出现在iPod应用程序播放列表选项卡上,且它在用户改变或删除它前它一直存在。

对于选择器,是用户指定的一个媒体项集合。这个集合没有播放列表状态。它在用户退出应用程序后不会存在——除非你保存了它。在任何情况下,在选择器的播放列表中两个集合都不会被显示。

Getting Media Items Programmatically

获取媒体项的编程方式


如果媒体项选择器没有提供你想要的控制,你能够使用API的数据库访问类。这些类是为了让你创建任意复杂的查询。例如,你能检索得到所有在特定类型中标题包含有特定单词或短语的歌曲。

使用编程方式访问分两步:

1.配置一个查询。

2.查询检索到的匹配的媒体项。

媒体查询 是对从设备的iPod库中检索到的项目,以及对这些项目进行如何安排的描述。它又两个属性需要配置。

过滤器 是对检索内容的描述。过滤器是可选的。当没有过滤器的时候,查询匹配整个iPod库。

分组类型 一个可选的键,它指定检索得到的媒体项的结合如何安排。


扩大一点说,过滤器能够根据应用程序的需求而变得简单或复杂。它由一个或多个媒体属性断言描述组成。 媒体属性断言 是一个逻辑条件语句,用来检测每个媒体项。所得到的媒体项是当你调用查询的时候,从iPod库里检索的满足过滤器条件的项。

可选的分组类型指定的安排以及集合的排序是和每个集合中的媒体项排序是一样的。举个例子,使用“专辑”分组类型的结果,返回的是按专辑分组的媒体项,每个专辑的歌曲是按照追踪的顺序排序的。

图 1-5 显示了一个媒体查询的配置和它在应用程序和iPod库之间的位置。

图 1-5  使用媒体查询访问设备的iPod库

As the figure shows, a query can fetch items or collections.如图所示,查询可以取得项目或者集合。

当你请求项目时,查询返回一个包括所有匹配过滤器的项目的集合。这些项目按照“自然”顺序排列,意思是他们的排序和在iTunes上显示的排序是一样的。

当你请求一个集合时,媒体查询不仅使用过滤器也使用分组类型。




About Collections and Playlists

关于集合和播放列表


媒体项集合 是一个媒体项目的数组。你通过访问媒体查询的collections属性从设备的iPod库获取集合。返回值是一个集合的有序数组,每个集合都是查询的分组类型的实例。

例如,你通过指派MPMediaGroupingAlbum 键指定一个“专辑”的分组类型到一个媒体查询——那就是说这个查询没有过滤器。这个collections 属性的值是包含整个iPod库里所有的音频按照专辑进行组织,每个集合就是一个专辑。 这个集合(专辑)按照字母进行排序。在每个集合中的这些歌(每个媒体项) 按照跟踪号码进行排列。图 1-6 说明了这一点。

图 1-6 从设备的iPod库中获取集合

在图的底部你看到的是设备的iPod库。In this illustrative case,在这个说明例子里,这个库只有两个音乐专辑,一个有七个跟踪项,另一个有八个。这些项目是按照他们的“自然”顺排列,就像在iTunes里出现的那样。

在图中间位置的上一点箭头代表的是定义一个通用(无过滤器)查询、应用程序“专辑”分组类型、和访问查询的collections属性。

图的顶部代表的是collections调用的结果。它是一个数组,它的元素是媒体项的数组。集合数组按照专辑名字排序。每个集合按照跟踪(track)号码排序。

你也可以构建自己的集合。这是有用的,例如,管理用户用媒体项选取器取得的选项。不过要注意,这个集合不是可变的。

播放列表 是一个特殊的媒体项排序集合。它又一些常规集合不具有的属性,例如名字和持久的ID。播放列表是通过用户在桌面创建的;在设备中他们是只读的。

Using iPod Library Change Notifications

使用iPod库改变通知


MPMediaLibrary 对象代表设备iPod库的状态。你能使用它来确保你的库的储存内容是最新的。This is useful because a user may sync their device, changing the content of the iPod library, while your application is running.这非常有用,因为用户可能会在当应用程序运行的时候同步他们的设备,改变iPod库的内容。

Mixing Your Own Sounds with iPod Library Sounds

用iPod库的声音混合你的私有声音


Note: 想要用设备iPod库中的声音混合应用程序的声音,你需要理解音频会话、音频会话类别、音频硬件线路变化、和音频中断。学写这些内容,请参考 Audio Session Programming Guide


你也需要理解你选择的音频格式会影响你的声音在设备上的同时播放。详见Core Audio Overview中的“Playing Multiple Sounds Simultaneously”


音乐播放器自动的使用媒体播放音频会话类别。如果应用程序使用音乐播放器且没有别的声音,你应该不必写音频会话代码。具体来说,你不应该初始化、配置或者激活音频会话。系统自动为音乐播放器处理播放、音频硬件线路改变、和音频中断。

另一方面,用iPod库的声音混合应用程序的声音,你需要配置和使用应用程序的音频会话。使用环境类别(Ambient category)来支持混合。处理音频中断、音频硬件线路改变、和音频会话激活需参照Audio Session Programming Guide。用iPod声音混合应用程序声音的例子,详见AddMusic