播放iPod Library中的歌曲
现在市面上的音乐播放器都支持iPod Library歌曲(俗称iPod音乐或者本地音乐)的播放,用户对于iPod音乐播放的需求也一直十分强烈。这篇要讲的是如何来播放iPod Library的歌曲。
概述
根据官方文档描述Apple从iOS 3.0开始允许开发者访问用户的iPod library来获取用户放在其中的歌曲等多媒体内容。
为此Apple提供了多种方法来访问和播放iPod中的音乐,下面我们来分别列举一下这些方法。
访问MediaLibrary
官方文档访问iPod Library的方法有两种,分别是MediaPicker和MediaQuery。
MediaPicker
MediaPicker是一个高度封装的iPod Library访问方式,通过使用MPMediaPickerController
类来访问iPod Library。这是一个UI控件,用户可以根据需要选择其中的音乐。这个类使用时非常方便,只需要生成一个“的实例,设置一下属性和delegate后present出来,接下来只要等待回调即可,在回调时需要手动dismiss picker。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
上面的代码将会得到如下的效果:
通过MediaPicker最终可以得到MPMediaItemCollection
,其中存放着所有在Picker中选中的歌曲,每一个歌曲使用一个MPMediaItem
对象表示。对于MediaPicker的使用也可以参考官方文档。
MediaQuery
如果你觉得MeidaPicker的功能或者UI不能满足你的要求那么可以使用MediaQuery。MediaQuery可以直接访问iPod Library的DB,并根据需要获取数据。官方文档给出了MediaQuery的示意图。
MediaQuery功能十分强大,它可以根据一个或多个条件查询满足需要的MediaItem。
你可以使用MPMediaQuery
的类方法来生成一些已经预置了条件的Query
1 2 3 4 5 6 7 8 9 10 11 |
|
也可以自己生成MPMediaPredicate
设置条件,并把它加到Query中,最后通过items和collections访问查询到的结果,例如:
1 2 3 4 5 6 7 8 9 10 11 |
|
这一过程可以表示为(图来自官方文档):
这里对于MediaQuery的用法就不再继续展开,关于这块内容并没有什么晦涩难懂的地方需要解释,大家可以通过阅读官方文档来详细了解其用法。
MediaCollection
MPMediaCollection
是MediaItem的合集,可以通过访问它的items属性来访问所有的MediaItem。
MPMediaPlaylist
是一个特殊的MPMediaCollection
代表用户创建的播放列表,它会比MediaCollection包含更多的信息,比如播放列表的名字等等。这些属性可以通过MPMediaEntity
的方法访问(MPMediaCollection是MPMediaEntity的子类,MPMediaItem也是)。
1 2 3 4 5 6 7 |
|
MediaItem
通过MediaPicker和MediaQuery最终都会得到MPMediaItem
,这个item中包含了许多信息。这些信息都可以通过MPMediaEntity
的方法访问,其中参数非常多就不列举了具体可以参照MPMediaItem.h。
使用MPMusicPlayerController
拿到iPod Library中的歌曲后就可以开始播放了。播放的方式有很多种,先介绍一下MediaPlayer framework
中的MPMusicPlayerController
类。
通过MPMusicPlayerController
的类方法可以生成两种播放器,生成方法如下:
1 2 3 4 5 |
|
这两个方法看似生成了一样的对象,但它们的行为却有很大不同。从Apple写的注释上我们可以很清楚的发现它们的区别。+applicationMusicPlayer
不会继承来自iOS系统自带的iPod应用中的播放状态,同时也不会覆盖iPod的播放状态。而+iPodMusicPlayer
完全继承iPod应用的播放状态(甚至是播放时间),对其实例的任何操作也会覆盖到iPod应用。对+iPodMusicPlayer
方法command+点击后可以看到更详细的注释。
1 2 3 4 5 6 7 |
|
说白了,当在使用iPodMusicPlayerv其实并不是你的程序在播放音频,而是你的程序在操纵iPod应用播放音频,即使你的程序crash了或者被kill了,音乐也不会因此停止。
而对于+applicationMusicPlayer
通过command+点击可以看到:
1 2 |
|
从注释中可以知道这个方法返回的对象虽然不是调用iPod应用播放的也不会影响到iPod应用,但它有个很大的缺点:无法后台播放,即使你在active了audioSession并且在app的设置中设置了Background Audio同样不会奏效。
综上所述,一般在开发音乐软件时很少用到这两个接口来进行iPod Library的播放,大部分开发者都是用这个类中的volme来调整系统音量的(这个属性在SDK 7中也被deprecate掉了)。如果你想用到这个类进行播放的话,这里需要提个醒,给MPMusicPlayerController
设置需要播放的音乐时要使用下面两个方法:
1 2 3 |
|
而不是这个属性:
1 2 3 |
|
光看名字很容易被nowPlayingItem
这个属性迷惑,它的意思其实是说在设置了MediaQuery或者MediaCollection之后再设置这个nowPlayingItem可以让播放器从这个item开始播放,前提是这个item需要在MediaQuery或者MediaCollection的.items集合内。
使用AVAudioPlayer和AVPlayer
除了使用MediaPlayer中的类还有很多其他方法来进行iPod播放,其中做的比较出色的是AVFoundation
中的AVAudioPlayer
和AVPlayer
。
这两个类的都有通过NSURL生成实例的初始化方法:
1 2 3 4 5 6 |
|
其中的NSURL正是来自于MPMediaItem
的MPMediaItemPropertyAssetURL
属性。
1 2 3 4 |
|
上面讲到MPMediaItem
时已经提到了它是MPMediaEntity
子类,可以通过-valueForProperty:
方法访问其中的属性。通过传入MPMediaItemPropertyAssetURL
就可以得到当前MediaItem对应的URL(ipod-library://xxxxx),生成Player进行播放。大致代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
注意:这里我需要更正一下,之前我在第二篇讲到AudioSession时写了这样一段话在使用AVAudioPlayer/AVPlayer时可以不用关心AudioSession的相关问题,Apple已经把AudioSession的处理过程封装了...
。这段话不对,我把AVFoundation和Mediaplayer混淆了,在写的时候也没注意,应该是在使用MPMusicPlayerController播放时不需要关心AudioSession的问题。
读取和导出数据
前面说到使用MPMediaItem
的MPMediaItemPropertyAssetURL
属性可以得到一个表示当前MediaItem的NSURL,有了这个NSURL我们使用AVFoundation中的类进行播放。播放只是最基本的需求,有了这个URL我们可以做更多更有趣的事情。
在AVFoundation中还有两个有趣的类:AVAssetReader
和AVAssetExportSession
。它们可以把iPod Library中的指定歌曲以指定的音频格式导出到内存中或者硬盘中,这个指定的格式包括PCM。这是一个激动人心的特性,有了PCM数据我们就可以做很多很多其他的事情了。
这部分如果要展开的话还会有相当多的内容,国外的先辈们早在2010年就已经发掘了这两个类的用法,详细参见这里和这里。这两篇讲的比较详细并且附有Sample(其中还涉及了一些Extended Audio File Services的内容),如果里面Sample无法下载可以从点击MediaLibraryExportThrowaway1.zip和VTM_AViPodReader.zip下载。
需要注意的是在使用AVAssetReader
的过程中如果访问系统的相机或者照片可能会使AVAssetReader
产生AVErrorOperationInterrupted
错误,此时需要重新生成Reader后调用-startReading
才可以继续读取数据。
小结
本篇介绍了一些与iPod Library相关的内容,小结一下:
Apple提供两种方法来访问iPod Library,它们分别是
MPMediaPickerController
和MPMediaQuery
;MPMediaPickerController
和MPMediaQuery
最后输出给开发者的对象是MPMediaItem
,MPMediaItem
的属性需要通过-valueForProperty:
方法获取了;MPMusicPlayerController
可以用来播放MPMediaItem
,但有很多局限性,使用时需要根据不同的使用场景来决定用哪个类方法生成实例;AVAudioPlayer
和AVPlayer
也可以用来播放MPMediaItem
,这两个类的功能比较完善,推荐使用,在使用之前别忘记设置AudioSession;MPMediaItem
可以得到对应的URL,这个URL可以用来做很多事情,例如用AVAssetReader
和AVAssetExportSession
可以导出其中的数据;
播放iPod Library中的歌曲相关推荐
- iOS音频播放 (七):播放iPod Library中的歌曲
文章转自:http://msching.github.io/blog/2014/09/07/audio-in-ios-7/ 由于最近工作量非常饱和,所以这第七篇来的有点晚(创建时间是9月7日..说出来 ...
- 音频(3):iPod Library Access Programming Guide:Introduction
Next Introduction 介绍 iPod库访问(iPod Library Access)让应用程序可以播放用户的歌曲.有声书.和播客.这个API设计使得基本播放变得非常简单,同时也支持高级的 ...
- Visual Basic 2005 – 如何播放剪贴簿中的音效数据
我们可以将音效数据复制到剪贴簿吗?当然可以.我们可以播放剪贴簿中的音效数据吗?当然可以.问题是,如何作呢? 以下的程序代码示范如何播放先前已复制到剪贴簿中的音效数据: Try ' 将剪贴簿中的数 ...
- Android 工程引入自定义Library后,工程无法识别Library中的类
这个问题有点神啊. 在工程中导入第三方类库包(自定义Library)本来运行的好好的,突然间所有引用的Library中的类都无法在工程中引用了,一个劲的打红叉,eclipse也重启了,项目也clean ...
- RTSP播放器开发过程中需要考虑哪些关键因素
好多开发者,在自研或者选择市面上的播放器的时候,除了常规的播放功能,还有很多点值得关注,如延迟.资源占用.网络异常处理.多实例支持.长时间运行稳定性等.以下是我们开发直播播放器过程中,考虑的部分关键因 ...
- c#winform演练 ktv项目 在dataGridView中显示歌曲列表
c#winform演练 ktv项目 在dataGridView中显示歌曲列表 dgv控件绑定泛型数组 dgv对象.DataSource = 数据源 关于数据源,它可以是: 数据集中的某个表 泛型对象数 ...
- VB直接播放EXE文件中的声音文件
使用资源文件,可以直接在在EXE文件中播放声音文件(WAV文件),使程序显得更加专业. ⑴启动 VB6.0,在"外接程序→外接程序管理器"中加载"Visual Basic ...
- 利用Enterprise Library中的DAAB构造的数据库访问架构
初学Enterprise Library中的DAAB部分,为了练练,一边学一边参照petshop 4.0写了一个数据库访问的架构,现把代码放上来,希望各位多指点,也可以使自己多学点 /Files/li ...
- 如何在library中使用productFlavors
前言: 前面笔者介绍过,如果用一套代码,定制化多个app.那就是使用productFlavors. 一般情况下都没有问题,但是在library的gradle里面,直接使用productFlavors是 ...
最新文章
- 深度学习领域最常用的10个激活函数,一文详解数学原理及优缺点
- 上海实验学校计算机等级考试,全国和上海的计算机等级考试一级内容差别?
- 算法 - 交换排序(C++)
- AI之HCI:人机交互Human-Computer Interaction的简介、发展历史、案例应用之详细攻略
- java jsp公共异常页面_实际应用中JSP页面的异常处理
- 【每日一题】8月25日题目精讲 XOR-pyramid
- 百度云盘照片导入华为相册里_必须知道的相册管理工具
- [redmine问题回复】redmine安装好后,在什么地方增加cvs配置库CVSROOT
- 141.PHP 对象赋值
- 实习成长之路——设计模式四:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
- 线程池合适的线程数量
- Java编译器使用入门
- STM32的ETR引脚计数功能
- 数据挖掘--数据流挖掘
- 共享打印机计算机名没有反应,共享打印机接收到打印任务,但是没有反应该怎么处理 - 系统之家...
- 三态内容寻址存储器(TCAM)工作原理
- 现代密码学期末复习26问
- 郭炜:就算倒在离开源成功最近的五米,也要让下一代开源人坚定前行
- AES加密:PHP与Java互通问题
- 图灵程序设计丛书:大规模数据处理入门与实战.epub
热门文章
- 又一家金融科技公司走到了退市边缘
- vue3.0中setup使用(两种用法)
- 大数据物流项目:业务服务器和大数据服务器(四)
- uni-app 打包之后日志输出和调试
- 数据管理能力成熟度评估模型(Word版)国家标准GB/T 36073—2018
- Avue 点击事件触发新增,新增携带数据
- html图片边框模糊,CSS3边框图片-像素虚边的问题
- pytorch测试,pil 读取图片 “IOError incurred when reading ‘{}‘. Will redo. Don‘t worry. Just chill
- Echarts 散点象限图(二)动态绘制
- 干货请收好:终于有人把用户画像的流程、方法讲明白了