1.访问音乐库的两种方法,如下图
(只能访问音频文件,如music,podcast,audiobook等)
2.MPMusicPlayerController的使用
有两种播放器可以选择,一种是application music player,另外一种是iPod music player。
第一种播放器是一种内部播放器,当程序对出后停止播放;而第二种播放器则与iPod播放器内的信息相关,退出之后不会停止播放。获取方式如下:
- + applicationMusicPlayer
- + iPodMusicPlayer
播放之前需要设置播放器的播放队列
- – setQueueWithQuery:
- – setQueueWithItemCollection:
管理播放模式和播放状态的一些属性
- property
- property
- property
- property
- property
- property
播放状态 MPMusicPlaybackState
enum {
MPMusicPlaybackStateStopped,
MPMusicPlaybackStatePlaying,
MPMusicPlaybackStatePaused,
MPMusicPlaybackStateInterrupted,
MPMusicPlaybackStateSeekingForward,
MPMusicPlaybackStateSeekingBackward
};
typedef NSInteger MPMusicPlaybackState;
播放控制方法
- – play
- – pause
- – stop
- – beginSeekingForward
- – beginSeekingBackward
- – endSeeking
- – skipToNextItem
- – skipToBeginning
- – skipToPreviousItem
播放状态发生变化时可以发送通知
- – beginGeneratingPlaybackNotifications
- – endGeneratingPlaybackNotifications
MPMusicPlayerControllerPlaybackStateDidChangeNotification
可以通过该通知来改变播放按钮的样式
MPMusicPlayerControllerNowPlayingItemDidChangeNotification
MPMusicPlayerControllerVolumeDidChangeNotification
具体步骤
1.注册和开始发送通知
1. Listing 2-1 Registering for and activating music player notifications
2. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
3.
4. [notificationCenter
5. addObserver: self
6. selector: @selector (handle_NowPlayingItemChanged:)
7. name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
8. object: musicPlayer];
9.
10. [notificationCenter
11. addObserver: self
12. selector: @selector (handle_PlaybackStateChanged:)
13. name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
14. object: musicPlayer];
15.
16. [musicPlayer beginGeneratingPlaybackNotifications];
1. Listing 2-2 Unregistering and deactivating music player notifications
2. [[NSNotificationCenter defaultCenter]
3. removeObserver: self
4. name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
5. object: musicPlayer];
6.
7. [[NSNotificationCenter defaultCenter]
8. removeObserver: self
9. name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
10. object: musicPlayer];
11.
12. [musicPlayer endGeneratingPlaybackNotifications];
2.创建并配置一个Music Player
1. Listing 2-3 Creating an application music player
2. MPMusicPlayerController* appMusicPlayer =
3. [MPMusicPlayerController applicationMusicPlayer];
4.
5. [appMusicPlayer setShuffleMode: MPMusicShuffleModeOff];
6. [appMusicPlayer setRepeatMode: MPMusicRepeatModeNone];
1. Listing 2-4 Creating an iPod music player
2. MPMusicPlayerController* iPodMusicPlayer =
3. [MPMusicPlayerController iPodMusicPlayer];
4.
5. if ([iPodMusicPlayer nowPlayingItem]) {
6. // Update the UI (artwork, song name, volume indicator, etc.)
7. // to reflect the iPod state
8. }
3.设置播放队列
- – setQueueWithQuery:
- – setQueueWithItemCollection:
4.控制播放
3.MPMediaPickerController的使用
1. <span style="font-size:18px;">- (IBAction)addSongsToMusicPlayer:(id)sender
2. {
3. MPMediaPickerController *mpController = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
4. mpController.delegate = self;
5. mpController.prompt = @"Add songs to play";
6. mpController.allowsPickingMultipleItems = YES;
7.
8. [self presentModalViewController:mpController animated:YES];
9. [mpController release];
10. }
11. </span>
主要是设置代理和选择多媒体类型,然后通过代理方法来获取选中的歌曲
1. <span style="font-size:18px;">#pragma mark - Media Picker Delegate Methods
2.
3. - (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
4. {
5. [self.musicPlayer setQueueWithItemCollection:mediaItemCollection];
6. [self dismissModalViewControllerAnimated:YES];
7. }
8.
9. - (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
10. {
11. [self dismissModalViewControllerAnimated:YES];
12. }</span>
4.MPMediaItem
用此方法来获取item的metadata
1. - (id) valueForProperty: (NSString *) property
NSString *const MPMediaItemPropertyTitle;
NSString *const MPMediaItemPropertyAlbumTitle;
NSString *const MPMediaItemPropertyArtist;
5.MPMediaItemCollection
collection是一组有序的item集合,可用同样的方法来获取collection的metadata
1. - (id) valueForProperty: (NSString *) property
创建
- + collectionWithItems:
- – initWithItems:
属性
- items
- property
- count
- property
6.MPMediaPlaylist
1. MPMediaQuery *myPlaylistsQuery = [MPMediaQuery playlistsQuery];
2. NSArray *playlists = [myPlaylistsQuery collections];
3.
4. for (MPMediaPlaylist *playlist in playlists) {
5. NSLog (@"%@", [playlist valueForProperty: MPMediaPlaylistPropertyName]);
6.
7. NSArray *songs = [playlist items];
8. for (MPMediaItem *song in songs) {
9. NSString *songTitle =
10. [song valueForProperty: MPMediaItemPropertyTitle];
11. NSLog (@"\t\t%@", songTitle);
12. }
13. }
7.MPMediaQuery
需要设置两个属性: filter and grouping type
filter描述查询内容,grouping type 描述返回内容的排列方式
查询可以获取items,也可以获取collections
- When you ask for items, the query returns a collection containing all the items that match the filter. The items are in “natural” order, meaning that they are ordered as iTunes shows them on the desktop.
- When you ask for collections, the media query employs not only its filter but also its grouping type.
获取全部歌曲
1. MPMediaQuery *everything = [[MPMediaQuery alloc] init];
2. NSLog(@"Logging items from a generic query...");
3. NSArray *itemsFromGenericQuery = [everything items];
4. for (MPMediaItem *song in itemsFromGenericQuery) {
5. NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
6. NSLog (@"%@", songTitle);
7. }
获取名为“Happy the Clown”的艺术家的歌曲
1. MPMediaPropertyPredicate *artistNamePredicate =
2. [MPMediaPropertyPredicate predicateWithValue: @"Happy the Clown"
3. forProperty: MPMediaItemPropertyArtist];
4.
5. MPMediaQuery *myArtistQuery = [[MPMediaQuery alloc] init];
6. [myArtistQuery addFilterPredicate: artistNamePredicate];
7.
8. NSArray *itemsFromArtistQuery = [myArtistQuery items];
多个查找条件,查找名为"Sad the Joker"的艺术家的"Stair Tumbling"专辑
1. MPMediaPropertyPredicate *artistNamePredicate =
2. [MPMediaPropertyPredicate predicateWithValue: @"Sad the Joker"
3. forProperty: MPMediaItemPropertyArtist];
4.
5. MPMediaPropertyPredicate *albumNamePredicate =
6. [MPMediaPropertyPredicate predicateWithValue: @"Stair Tumbling"
7. forProperty: MPMediaItemPropertyAlbumTitle];
8.
9. MPMediaQuery *myComplexQuery = [[MPMediaQuery alloc] init];
10.
11. [myComplexQuery addFilterPredicate: artistNamePredicate];
12. [myComplexQuery addFilterPredicate: albumNamePredicate];
1. Listing 4-4 Applying multiple predicates when initializing a media query
2. NSSet *predicates =
3. [NSSet setWithObjects: artistNamePredicate, albumNamePredicate, nil];
4.
5. MPMediaQuery *specificQuery =
6. [[MPMediaQuery alloc] initWithFilterPredicates: predicates];
1. Listing 4-5 Testing if a property key can be used for a media property predicate
2. if ([MPMediaItem canFilterByProperty: MPMediaItemPropertyGenre]) {
3. MPMediaPropertyPredicate *rockPredicate =
4. [MPMediaPropertyPredicate predicateWithValue: @"Rock"
5. forProperty: MPMediaItemPropertyGenre];
6. [query addFilterPredicate: rockPredicate];
7. }
1. Listing 4-6 Using grouping type to specify media item collections
2. MPMediaQuery *query = [[MPMediaQuery alloc] init];
3.
4. [query addFilterPredicate: [MPMediaPropertyPredicate
5. predicateWithValue: @"Moribund the Squirrel"
6. forProperty: MPMediaItemPropertyArtist]];
7. // Sets the grouping type for the media query
8. [query setGroupingType: MPMediaGroupingAlbum];
9.
10. NSArray *albums = [query collections];
11. for (MPMediaItemCollection *album in albums) {
12. MPMediaItem *representativeItem = [album representativeItem];
13. NSString *artistName =
14. [representativeItem valueForProperty: MPMediaItemPropertyArtist];
15. NSString *albumName =
16. [representativeItem valueForProperty: MPMediaItemPropertyAlbumTitle];
17. NSLog (@"%@ by %@", albumName, artistName);
18.
19. NSArray *songs = [album items];
20. for (MPMediaItem *song in songs) {
21. NSString *songTitle =
22. [song valueForProperty: MPMediaItemPropertyTitle];
23. NSLog (@"\t\t%@", songTitle);
24. }
25. }
query的一些简便构造方法
专辑封面的使用
1. Listing 4-7 Displaying album artwork for a media item
2. MPMediaItemArtwork *artwork =
3. [mediaItem valueForProperty: MPMediaItemPropertyArtwork];
4. UIImage *artworkImage =
5. [artwork imageWithSize: albumImageView.bounds.size];
6. if (artworkImage) {
7. albumImageView.image = artworkImage;
8. } else {
9. albumImageView.image = [UIImage imageNamed: @"noArtwork.png"];
10. }
11.