【发布时间】:2013-06-15 19:49:33
【问题描述】:
我正在使用 AVAudioPlayer 进行音频流传输。现在我想在锁定屏幕上显示一些音频元数据(例如艺术家、专辑名称、标题和艺术品)。但是我遇到了如下问题:
• 如果我使用该语句
NSURL *url = [NSURL URLWithString:urlString];
创建 URL,然后我可以获取元数据。但是音频播放器停止(仅播放几秒钟的音频)并且没有播放完音频。
• 如果我使用该语句
NSURL *url = [[NSURL alloc] initWithString:urlString];
要创建 URL,音频播放器可以正常工作。但是代码没有进入 for (NSString *format in [asset availableMetadataFormats]) 循环获取元数据。
下面是我用来获取元数据的一段代码。想知道以上两个 NSURL 创建之间有什么区别。以及如何解决此问题,以便音频播放器在获取元数据时可以正常工作。提前非常感谢。
Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
if (playingInfoCenter)
{
//NSURL *url = [NSURL URLWithString:urlString];
NSURL *url = [[NSURL alloc] initWithString:urlString];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
for (NSString *format in [asset availableMetadataFormats])
{
for (AVMetadataItem *metadataItem in [asset metadataForFormat:format])
{
if ([metadataItem.commonKey isEqualToString:@"artwork"])
{
UIImage* image = [UIImage imageWithData:[(NSDictionary*)metadataItem.value objectForKey:@"data"]];
MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:image];
[songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork];
}
else if ([metadataItem.commonKey isEqualToString:@"title"])
{
[songInfo setObject:metadataItem.value forKey:MPMediaItemPropertyTitle];
}
else if ([metadataItem.commonKey isEqualToString:@"albumName"])
{
[songInfo setObject:metadataItem.value forKey:MPMediaItemPropertyAlbumTitle];
}
else if ([metadataItem.commonKey isEqualToString:@"artist"])
{
[songInfo setObject:metadataItem.value forKey:MPMediaItemPropertyArtist];
}
}
}
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];
}
【问题讨论】:
标签: ios metadata avaudioplayer mpnowplayinginfocenter