AVAudioPlayer,MPNowPlayingInfoCenter和音频元数据
我正在使用AVAudioPlayer进行音频流式传输。 现在我想在锁定屏幕上显示一些音频元数据(例如艺术家,专辑名称,标题和图稿)。 不过,我得到如下问题:
•如果我使用该陈述
NSURL *url = [NSURL URLWithString:urlString];
创建URL,然后我可以获取元数据。 但是音频播放器停止(只播放音频的几秒钟)并且没有完成音频。
•如果我使用该陈述
NSURL *url = [[NSURL alloc] initWithString:urlString];
要创建网址,音频播放器工作正常。 但是代码没有进入for(在[asset availableMetadataFormats]循环中的NSString *格式)来获取元数据。
以下是我用来获取元数据的一段代码。 想知道上述两个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];
}
首先,你使用ARC吗? 如果不是,那么这两个变量就有区别。 在[NSURL URLWithString:urlString]
的情况下,您将获得一个自动释放对象(应该在不再使用时自动释放)并且[[NSURL alloc] initWithString:urlString]
成为对象的所有者(您保留它)你必须调用release
它时,你不需要它。
但是,如果代码不能输入for语句,那么可以使用for (NSString *format in [asset availableMetadataFormats])
,它可以表示以下三种情况之一:
asset
为零,如果您传递给[AVURLAsset URLAssetWithURL:url options:nil]
未指向有效文件,则会发生这种情况。 availableMetadataFormats
为零,该资产没有任何可用的元数据格式。 availableMetadataFormats
返回的数组不是零,而是空的。 我很抱歉没有告诉你更多,但我需要更多关于应用程序状态的信息。 这些建议可能会帮助您找到问题。
链接地址: http://www.djcxy.com/p/66063.html上一篇: AVAudioPlayer, MPNowPlayingInfoCenter and audio metadata