我正在创建一个应用程序,用户可以在设置选项卡中选择一首歌曲,并根据需要在不同的视图中播放.我想要它,以便如果用户要关闭应用程序并再次打开它,则可以存储此项目.
我设法允许用户选择并存储一首歌曲:
-(IBAction)showMediaPicker:(id)sender{
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAny];
mediaPicker.delegate = self;
mediaPicker.allowsPickingMultipleItems = NO;
mediaPicker.prompt = @"Select Alarm Sound";
[self presentModalViewController:mediaPicker animated:YES];
}
- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {
[self dismissModalViewControllerAnimated: YES];
settingsData.selectedSong = mediaItemCollection;//Object of type MPMediaItemCollection
Run Code Online (Sandbox Code Playgroud)
但我希望用户每次使用该应用程序时都必须这样做.
我尝试过使用NSUserDefaults:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:settingsData.selectedSong forKey:@"alarmSoundKey"];
[defaults synchronize];
Run Code Online (Sandbox Code Playgroud)
但得到错误:
* - [NSUserDefaults setObject:forKey:]:尝试插入类'MPMediaItemCollection'的非属性值''.请注意,属性列表中的字典和数组也必须仅包含属性值.
请问有什么选择?不太确定如何解决这个问题......
解决方案
我还不能回答我自己的问题所以我会把它放在这里:
我已经找到了我自己的解决方案:
首先将MPMediaItemCollection转换/编码为NSData对象,然后使用NSUserDefaults将其存储起来:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"someKey"]; …Run Code Online (Sandbox Code Playgroud) 假设我有一个具有以下播放列表结构的 iOS 音乐库:
A Folder
|
---> A Playlist
|
---> Song A
Run Code Online (Sandbox Code Playgroud)
我运行以下代码:
import MediaPlayer
let playlists = MPMediaQuery.playlists().collections! as! [MPMediaPlaylist]
for playlist in playlists {
let firstItemName = playlist.items.first?.title ?? "none"
print("playlist: \(playlist.name!), first item: \"\(firstItemName)\"")
}
Run Code Online (Sandbox Code Playgroud)
我得到这个控制台输出:
播放列表:播放列表,第一项:“歌曲 A”
播放列表:A 文件夹,第一项:“歌曲 A”
我已经查看了所有 MediaPlayer 框架文档,但找不到任何方法来通过 API 发现播放列表和文件夹之间的父/子关系(或者甚至告诉集合包含其他集合)。我只想在用户浏览 A 文件夹后才显示 A 播放列表,而不是将它们显示为兄弟姐妹(或者甚至可能完全过滤掉 A 文件夹。
此外,文件夹和播放列表在运行时都具有相同的类:MPConcreteMediaPlaylist.
如何使用NSUserDefaults持久保存MPMediaItemCollection对象?MPMediaItemCollection对象是从iPod中选择的单首歌曲.
几个小时我一直在努力奋斗!任何人对NSUserDefaults有任何想法或替代方案,或者从MPMediaItemCollection或其他任何东西转换?!
谢谢...
这是我的问题=)
MPMediaQuery *artistQuery = [MPMediaQuery artistsQuery];
NSArray *songsByArtist = [artistQuery collections];
Run Code Online (Sandbox Code Playgroud)
如何在songsByArtist中获取MPMediaItemCollections的每位艺术家的专辑数量?
例如:
披头士乐队的3张专辑
AC/DC 6专辑
谢谢 !!
我尝试用 Swift 制作我自己的音乐播放器。我需要跳转到我的 MPMediaItemCollection 的特定歌曲/索引并开始播放它,但我只能找到像 skipToNextItem() 和 skipToPreviousItem() 这样的方法。除了循环,还有其他方法可以做到这一点吗?
let player = MPMusicPlayerController.systemMusicPlayer()
player.setQueueWithItemCollection(mediaCollection)
player.play()
Run Code Online (Sandbox Code Playgroud) 我正在研究查看用户视频并将其通过带有URL的AVPlayerItem传递给AVPlayer的代码。
要在iOS设备上获取所有视频,您可以执行以下操作:
let videoNumber = MPMediaType.anyVideo.rawValue
let predicate = MPMediaPropertyPredicate.init(value: videoNumber, forProperty: MPMediaItemPropertyMediaType)
let query = MPMediaQuery.init()
query.addFilterPredicate(predicate)
if let items = query.items
{
mediaCollection = MPMediaItemCollection(items: items)
// -1 would indicate an error condition
print("number of items in collection is \(mediaCollection?.count ?? -1)")
}
Run Code Online (Sandbox Code Playgroud)
当您从items数组中选择要使用的MPMediaItem时,应该将其assetURL与之配合使用。
问题是,在我的设备上,我所有的assetURL属性均为NULL。巧合的是,尽管hasProtectedAsset对其中的每一项是false,isCloudItem为这些项目的true。
如何提出assetURL可以传递给任何媒体播放器的有效证件?开发人员无法获得正确的引用和对用户iPod库中媒体的访问权在某种程度上让人感到虚假。
mpmovieplayercontroller mpmediaitem mpmediaitemcollection ios
我正在尝试复制iPod应用程序的清除队列功能,但是我无法创建一个空的MPMediaItemCollection来调用setQueueWithItemCollection:
例如
[self.musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:[NSArray array]]];
Run Code Online (Sandbox Code Playgroud)
其中musicPlayer是MPMusicPlayerController.
抛出异常:
*** Terminating app due to uncaught exception 'MPMediaItemCollectionInitException', reason: 'items array must not be empty'
Run Code Online (Sandbox Code Playgroud)
有没有办法清除MPMusicPLayerController队列,避免这个问题?
任何帮助非常感谢,简历
我正在尝试播放iPod播放列表中的歌曲.至于播放列表也可能有视频,我想只播放其中的歌曲.
MPMusicPlayerController *mp = [MPMusicPlayerController applicationMusicPlayer];
MPMediaQuery *query = [MPMediaQuery songsQuery];
query.groupingType = MPMediaGroupingPlaylist;
NSArray *playlists = [query collections];
BOOL found = NO;
for(MPMediaPlaylist *playlist in playlists)
{
NSString *name = [playlist valueForProperty:MPMediaPlaylistPropertyName];
if([name caseInsensitiveCompare:@"MyPlaylist"] == NSOrderedSame && [playlist count] > 0)
{
MPMediaItemCollection *collection = [MPMediaItemCollection collectionWithItems:playlist.items];
[mp setQueueWithItemCollection:collection];
found = YES;
NSLog(@"items count %d", [playlist count]);
for (MPMediaItem *item in [collection items]){
NSLog(@"%@", [item valueForKey:MPMediaItemPropertyMediaType]);
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在我加载1首歌曲和2个视频的播放列表后,输出为:
items count 3
256
256
1
我不明白为什么我也会收到视频,如果查询是为了检索歌曲,而媒体项目的媒体类型是MPMediaTypeMovie(256或1 << …
我是Swift编程的初学者,他试图重新编写我在网上找到的来自Persistent ID的歌曲.原始代码可在以下网站找到:
我想在Swift 2中编写这段代码(我不会使用Objective-C),但我缺乏翻译它的知识和经验.
代码:
MPMediaItem *song;
MPMediaPropertyPredicate *predicate;
MPMediaQuery *songQuery;
predicate = [MPMediaPropertyPredicate predicateWithValue: MyPersistentIdString forProperty:MPMediaItemPropertyPersistentID];
songQuery = [[MPMediaQuery alloc] init];
[songQuery addFilterPredicate: predicate];
if (songQuery.items.count > 0)
{
//song exists
song = [songQuery.items objectAtIndex:0];
CellDetailLabel = [CellDetailLabel stringByAppendingString:[song valueForProperty: MPMediaItemPropertyTitle]];
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
1)这个代码是否可以重写为Swift,它是否仍然足够流动而没有折旧?
2)我如何使用函数调用此代码?
ios ×7
mpmediaitem ×5
iphone ×4
mpmediaquery ×4
objective-c ×2
swift ×2
ios5 ×1
ipod ×1
swift2 ×1