AVAudioPlayer,MPNowPlayingInfoCenter和音频元数据

时间:2013-06-15 19:49:33

标签: ios metadata avaudioplayer mpnowplayinginfocenter

我正在使用AVAudioPlayer进行音频流传输。现在我想在锁定屏幕上显示一些音频元数据(例如,艺术家,专辑名称,标题和艺术作品)。但是我遇到了如下问题:

•如果我使用声明

NSURL *url = [NSURL URLWithString:urlString];

创建URL,然后我可以获取元数据。但音频播放器停止播放(只播放音频的几秒钟)并且没有完成音频。

•如果我使用声明

NSURL *url = [[NSURL alloc] initWithString:urlString];

创建URL,音频播放器工作正常。但是代码没有进入 for(NSRtring * 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];
}

1 个答案:

答案 0 :(得分:0)

首先,你使用ARC吗?如果不是,则这两个变量之间存在差异。在[NSURL URLWithString:urlString]的情况下,您将获得一个自动释放的对象(应该在不再使用时自动释放)并且[[NSURL alloc] initWithString:urlString]您成为对象的所有者(您保留它)并且您必须调用只要你不需要就可以release

但是,对于for (NSString *format in [asset availableMetadataFormats])问题,如果代码没有输入for语句,则可能意味着以下三种情况之一:

  1. asset为nil,如果您传递到[AVURLAsset URLAssetWithURL:url options:nil]的网址未指向有效文件,则会发生这种情况。
  2. availableMetadataFormats为零,该资产没有任何可用的元数据格式。
  3. availableMetadataFormats返回的数组不是nil,而是空的。
  4. 我很抱歉没有告诉你更多,但我需要有关应用状态的更多信息。这些建议可能只会帮助您找到问题。