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

    下一篇: How can I create a UIColor from a hex string?