1.访问音乐库的两种方法,如下图
(只能访问音频文件,如music,podcast,audiobook等)
2.MPMusicPlayerController的使用
有两种播放器可以选择,一种是application music player,另外一种是iPod music player。
第一种播放器是一种内部播放器,当程序对出后停止播放;而第二种播放器则与iPod播放器内的信息相关,退出之后不会停止播放。获取方式如下:
+ applicationMusicPlayer
+ iPodMusicPlayer
播放之前需要设置播放器的播放队列
– setQueueWithQuery:
– setQueueWithItemCollection:
管理播放模式和播放状态的一些属性
currentPlaybackTime property
nowPlayingItem property
playbackState property
repeatMode property
shuffleMode property
volume 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.注册和开始发送通知
Listing 2-1 Registering for and activating music player notifications
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver: self
selector: @selector (handle_NowPlayingItemChanged:)
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object: musicPlayer];
[notificationCenter
addObserver: self
selector: @selector (handle_PlaybackStateChanged:)
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
Listing 2-2 Unregistering and deactivating music player notifications
[[NSNotificationCenter defaultCenter]
removeObserver: self
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object: musicPlayer];
[[NSNotificationCenter defaultCenter]
removeObserver: self
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: musicPlayer];
[musicPlayer endGeneratingPlaybackNotifications];
2.创建并配置一个Music Player
Listing 2-3 Creating an application music player
MPMusicPlayerController* appMusicPlayer =
[MPMusicPlayerController applicationMusicPlayer];
[appMusicPlayer setShuffleMode: MPMusicShuffleModeOff];
[appMusicPlayer setRepeatMode: MPMusicRepeatModeNone];
Listing 2-4 Creating an iPod music player
MPMusicPlayerController* iPodMusicPlayer =
[MPMusicPlayerController iPodMusicPlayer];
if ([iPodMusicPlayer nowPlayingItem]) {
// Update the UI (artwork, song name, volume indicator, etc.)
// to reflect the iPod state
}
3.设置播放队列
– setQueueWithQuery:
– setQueueWithItemCollection:
4.控制播放
3.MPMediaPickerController的使用
<span style="font-size:18px;">- (IBAction)addSongsToMusicPlayer:(id)sender
{
MPMediaPickerController *mpController = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
mpController.delegate = self;
mpController.prompt = @"Add songs to play";
mpController.allowsPickingMultipleItems = YES;
[self presentModalViewController:mpController animated:YES];
[mpController release];
}
</span>
主要是设置代理和选择多媒体类型,然后通过代理方法来获取选中的歌曲
<span style="font-size:18px;">#pragma mark - Media Picker Delegate Methods
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
[self.musicPlayer setQueueWithItemCollection:mediaItemCollection];
[self dismissModalViewControllerAnimated:YES];
}
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
[self dismissModalViewControllerAnimated:YES];
}</span>
4.MPMediaItem
用此方法来获取item的metadata
- (id) valueForProperty: (NSString *) property
NSString *const MPMediaItemPropertyTitle ;
NSString *const MPMediaItemPropertyAlbumTitle ;
NSString *const MPMediaItemPropertyArtist ;
5.MPMediaItemCollection
collection是一组有序的item集合,可用同样的方法来获取collection的metadata
- (id) valueForProperty: (NSString *) property
创建
+ collectionWithItems:
– initWithItems:
属性
items property
representativeItem property
count property
mediaTypes property
6.MPMediaPlaylist
MPMediaQuery *myPlaylistsQuery = [MPMediaQuery playlistsQuery];
NSArray *playlists = [myPlaylistsQuery collections];
for (MPMediaPlaylist *playlist in playlists) {
NSLog (@"%@", [playlist valueForProperty: MPMediaPlaylistPropertyName]);
NSArray *songs = [playlist items];
for (MPMediaItem *song in songs) {
NSString *songTitle =
[song valueForProperty: MPMediaItemPropertyTitle];
NSLog (@"\t\t%@", songTitle);
}
}
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.
获取全部歌曲
MPMediaQuery *everything = [[MPMediaQuery alloc] init];
NSLog(@"Logging items from a generic query...");
NSArray *itemsFromGenericQuery = [everything items];
for (MPMediaItem *song in itemsFromGenericQuery) {
NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
NSLog (@"%@", songTitle);
}
获取名为“Happy the Clown”的艺术家的歌曲
MPMediaPropertyPredicate *artistNamePredicate =
[MPMediaPropertyPredicate predicateWithValue: @"Happy the Clown"
forProperty: MPMediaItemPropertyArtist];
MPMediaQuery *myArtistQuery = [[MPMediaQuery alloc] init];
[myArtistQuery addFilterPredicate: artistNamePredicate];
NSArray *itemsFromArtistQuery = [myArtistQuery items];
多个查找条件,查找名为"Sad the Joker"的艺术家的"Stair Tumbling"专辑
MPMediaPropertyPredicate *artistNamePredicate =
[MPMediaPropertyPredicate predicateWithValue: @"Sad the Joker"
forProperty: MPMediaItemPropertyArtist];
MPMediaPropertyPredicate *albumNamePredicate =
[MPMediaPropertyPredicate predicateWithValue: @"Stair Tumbling"
forProperty: MPMediaItemPropertyAlbumTitle];
MPMediaQuery *myComplexQuery = [[MPMediaQuery alloc] init];
[myComplexQuery addFilterPredicate: artistNamePredicate];
[myComplexQuery addFilterPredicate: albumNamePredicate];
Listing 4-4 Applying multiple predicates when initializing a media query
NSSet *predicates =
[NSSet setWithObjects: artistNamePredicate, albumNamePredicate, nil];
MPMediaQuery *specificQuery =
[[MPMediaQuery alloc] initWithFilterPredicates: predicates];
Listing 4-5 Testing if a property key can be used for a media property predicate
if ([MPMediaItem canFilterByProperty: MPMediaItemPropertyGenre]) {
MPMediaPropertyPredicate *rockPredicate =
[MPMediaPropertyPredicate predicateWithValue: @"Rock"
forProperty: MPMediaItemPropertyGenre];
[query addFilterPredicate: rockPredicate];
}
Listing 4-6 Using grouping type to specify media item collections
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate: [MPMediaPropertyPredicate
predicateWithValue: @"Moribund the Squirrel"
forProperty: MPMediaItemPropertyArtist]];
// Sets the grouping type for the media query
[query setGroupingType: MPMediaGroupingAlbum];
NSArray *albums = [query collections];
for (MPMediaItemCollection *album in albums) {
MPMediaItem *representativeItem = [album representativeItem];
NSString *artistName =
[representativeItem valueForProperty: MPMediaItemPropertyArtist];
NSString *albumName =
[representativeItem valueForProperty: MPMediaItemPropertyAlbumTitle];
NSLog (@"%@ by %@", albumName, artistName);
NSArray *songs = [album items];
for (MPMediaItem *song in songs) {
NSString *songTitle =
[song valueForProperty: MPMediaItemPropertyTitle];
NSLog (@"\t\t%@", songTitle);
}
}
query的一些简便构造方法
专辑封面的使用
Listing 4-7 Displaying album artwork for a media item
MPMediaItemArtwork *artwork =
[mediaItem valueForProperty: MPMediaItemPropertyArtwork];
UIImage *artworkImage =
[artwork imageWithSize: albumImageView.bounds.size];
if (artworkImage) {
albumImageView.image = artworkImage;
} else {
albumImageView.image = [UIImage imageNamed: @"noArtwork.png"];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?