《iOS组件与框架——iOS SDK高级特性剖析》——第6章,第6.2节打造播放引擎
本节书摘来自异步社区《iOS组件与框架——iOS SDK高级特性剖析》一书中的第6章,第6.2节打造播放引擎,作者 【美】Kyle Richter , Joe Keeley,更多章节内容可以访问云栖社区“异步社区”公众号查看
6.2 打造播放引擎
iOS组件与框架——iOS SDK高级特性剖析
如果对播放控制没有深刻认识,获取音频数据将毫无意义。要在应用中播放音乐,需要创建一个MPMusicPlayerController实例。在头文件ICFViewController.h中,声明了一个名为player的MPMusicPlayerController变量,在整个示例应用中,都将使用它来控制播放以及获取当前播放的曲目的信息。
在方法viewDidLoad中,初始化了MPMusicPlayerController变量player,这是使用MPMusicPlayerController的一个类方法完成的。创建MPMusicPlayerController实例的方式有两种:一是使用applicationMusicPlayer,这将在应用内播放音乐,不影响iPod的状态,并在应用退出后停止播放;二是使用iPodMusicPlayer,这将控制应用iPod,从iPod播放头的位置开始继续播放,应用进入后台后也不会停止播放。本章的示例应用使用的是applicationMusicPlayer;但可轻松地转而使用iPodMusicPlayer,而无需对其他代码做任何修改。
6.2.1 注册播放通知
要有效地播放音乐,必须知道音乐播放器的状态。处理音乐播放器时,需要监视3种通知:当前播放的乐曲变了、音量变了,以及播放状态发生了变化。要监视这些状态,可使用NSNotificationCenter来订阅前述事件。为确保代码整洁易懂,示例应用使用了辅助方法registerMediaPlayerNotifications。将观察者加入NSNotificationCenter后,需要对对象player调用beginGeneratingPlaybackNotifications。
注册通知后,确保在清理内存和视图期间将它们注销,这很重要,否则将导致应用崩溃以及其他意外行为。另外,在方法viewWillDisapper中还调用了endGeneratingPlayback Notifications。
除注册音乐播放器回调方法外,还将创建一个NSTimer,用于更新播放进度和播放头时间标签。在示例应用中,这个NSTimer名为playbackTimer。对于通知回调方法和NSTimer,暂时就介绍这些,后面的6.2.3节将详细讨论它们。
6.2.2 播放控制
示例应用提供了多个让用户能够与音乐播放器交互的按钮,如播放、暂停、下一曲、前一曲以及前进和后退30秒。首先需要实现的是播放和暂停方法。这是一个简单的切换按钮:如果正在播放,就暂停;如果已暂停或停止,就继续播放。至于将按钮文本在Play和Pause之间切换的代码,将在6.2.3节讨论状态变化通知回调方法时进行讨论。
用户欣赏音乐时,还应能够跳到下一曲或前一曲。这是通过对对象player调用另外两个方法实现的。
6.2.3 响应状态变化
前面给3个通知注册了回调方法。这些通知让应用能够获悉MPMusicPlayerController的当前状态和行为。当前播放的曲目变了时,将调用第一个方法。这个方法包含两部分,第一部分更新专辑封面,第二部分更新显示艺术家、曲目名和专辑的标签。
MPMusicPlayerController当前播放的音频或视频由一个MPMediaItem对象表示,要获取这个对象,可对MPMusicPlayerController实例调用方法nowPlayingItem。
创建了一个用于表示专辑封面的UIImage,并将其初始化为一个占位符,在MPMediaItem没有专辑封面时将显示该占位符。MPMediaItem使用键值属性来表示存储的数据,表6.1列出了所有的键值属性。创建了一个MPMediaItemArtwork,并将其设置为专辑封面数据。Apple文档指出,如果没有专辑封面,获取属性MPMediaItemPropertyArtwork时将返回nil,但实际情况并非如此。为解决这个问题,将专辑封面加载到一个UIImage中,并检查结果。如果结果为nil,就认为没有专辑封面,进而加载前面指定的占位符。即便MPMediaItemPropertyArtwork在没有专辑封面时返回nil,示例应用也能正常运行。
方法nowPlayingItemChanged:的第二部分更新歌曲名、艺术家信息和专辑名,如图6.1所示。如果获取这些属性时返回nil,就使用占位符字符串。表6.1列出了MPMediaItem的所有可访问属性。请注意,媒体项为播客时,则除表6.1所示的属性外,还有其他一些属性,详情请参阅Apple的MPMediaItem文档。在这个表中,还指出了以编程方式查找媒体项时,属性键是否可用于谓词搜索。
[
监视音乐播放器的状态很重要,在状态可能受应用无法控制的外部输入的影响时尤其如此。如果状态发生变化,将调用方法playbackStateChanged:。在这个方法中,创建了变量playbackState,用于存储播放器的当前状态。这个方法执行了多项重要任务,其中第一项任务是更新按钮play/pause的文本,以反映当前状态。另外,创建和拆除了6.2.1节提到的NSTimer。如果应用正在播放音频,就将该定时器设置为每隔0.3秒触发一次,以便更新播放时间标签以及指出播放头位置的UIProgressIndicator。这个定时器触发的方法updateCurrentPlaybackTimer将在下一小节讨论。
除这个示例应用演示的状态外,还有其他3种状态。第一种状态是MPMusicPlaybackState Interrupted,表示音频播放中断,如来电导致中断。其他两种状态是MPMusicPlaybackState SeekingForward和MPMusicPlaybackStateSeekingBackward,表示音乐播放器正为查找指定播放位置而前进或后退。
如果音量发生变化,也必须通过应用的音量滑块反映出来。这是由通知回调方法volume Changed:完成的。在这个方法中,获取了播放器的当前音量,并相应地设置volumeSlider。
6.2.4 时长和定时器
在大多数情况下,用户都想获悉当前播放的歌曲的信息,如已播放多长时间以及还有多长时间。示例应用包含两个显示这些数据的方法。第一个是updateSongDuration,在当前播放的歌曲变了或应用启动时被调用。它创建一个指向当前播放歌曲的引用,再使用属性键playbackDuration获取该歌曲的时长(单位为秒)。然后,将这项数据转换为小时、分钟和秒数,并将结果显示在UIProgressIndicator旁边的标签上。
第二个方法是updateCurrentPlaybackTime,由NSTimer每隔0.3秒调用一次,而这个NSTimer由6.2.3节讨论的方法playbackStateChanged:控制。与方法updateSongDuration一样,将已播放的时间转换为小时、分钟和秒数;另外,还根据前面确定的歌曲时长计算percentagePlayed,并使用它来更新playbackProgressIndicator。由于currentPlaybackTime只能精确到秒,因此没有必要过于频繁地调用这个方法。然而,调用这个方法的频率越高,显示的结果就越精确。
6.2.5 随机播放和重复播放
除前面提到的属性和控制外,还可指定MPMusicPlayerController的属性repeatMode和shuffleMode。虽然示例应用没有实现设置这两个属性的功能,但实现起来非常容易。
重复播放模式包括MPMusicRepeatModeDefault(用户的预定义首选模式)、MPMusicRepeat ModeNone、MPMusicRepeatModeOne和MPMusicRepeatModeAll。
随机播放模式包括MPMusicShuffleModeDefault(用户的预定义首选模式)、MPMusicShuffle ModeOff、MPMusicShuffleModeSongs和MPMusicShuffleModeAlbums,其中MPMusicShuffle ModeDefault表示用户的预定义首选模式。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《Android UI基础教程》——导读
本节书摘来自异步社区《Android UI基础教程》一书中的目录,作者 【美】Jason Ostrander,更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录 第1部分 Android UI基础 第1章 入门 1.1 Hello World 1.2 Android 应用程序的基本结构 1.3 Android UI基础 1.4 工具 1.5 结束语 第2章 创建第一个 2.1 创建一个应用 2.2 开始使用Android视图 2.3 排布视图 2.4 显示列表 2.5 理解活动 2.6 防止应用程序无响应(ANR) 2.7 完成TIMETRACKER 2.8 结束语 第3章 更进一步第4章 基本视图第5章 可复用UI第6章 导航和数据加载第7章 Android 部件第3部分 高级UI 开发第8章 处理手势操作第9章 动画第10章 创建自定义视图第11章 创建高级图形第12章 本地化和辅助功能
- 下一篇
《Adobe Flash Professional CC经典教程》——第1课 工作流程1.1 启动Flash并打开文件
本节书摘来自异步社区《Adobe Flash Professional CC经典教程》一书中的第1章,第1.1节,作者:【美】Adobe公司 更多章节内容可以访问云栖社区“异步社区”公众号查看。 第1课 工作流程 课程概述在这一课中,将学习如何执行以下任务: 在Flash中创建新文件 调整“舞台”设置和文件属性 向“时间轴”中添加图层 在“时间轴”中管理关键帧 在“库”面板中处理导入的图像 在“舞台”上移动和重新定位对象 打开和使用面板 在“工具”面板中选择和使用工具 预览Flash动画 保存Flash文件 访问Flash的在线资源 完成本课的学习需要不到1个小时的时间。先从光盘中将文件夹Lesson01复制到硬盘中。 在Flash中,动作发生在“舞台”上,“时间轴”用于组织帧和图层,其他面板允许编辑和控制所创建的内容。 1.1 启动Flash并打开文件 第一次启动Flash时,将会看到一个欢迎屏幕,其中带有指向标准文件模板、教程及其他资源的链接。在本课程中,将创建一个简单的动画,显示几张度假快照,可添加一些照片和一个标题,并且在这个过程中学习在“舞台”上定位元素,以及沿着“时间轴”放...
相关文章
文章评论
共有0条评论来说两句吧...