【问题标题】:AVAudioPlayer, MPNowPlayingInfoCenter and audio metadataAVAudioPlayer、MPNowPlayingInfoCenter 和音频元数据
【发布时间】: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


    【解决方案1】:

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

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

    1. asset 为 nil,如果您传递给 [AVURLAsset URLAssetWithURL:url options:nil] 的 URL 未指向有效文件,则会发生这种情况。
    2. availableMetadataFormats 为零,该资产没有任何可用的元数据格式。
    3. availableMetadataFormats返回的数组不是nil,而是空的。

    很抱歉没有告诉您更多信息,但我需要有关应用程序状态的更多信息。这些建议可能只是帮助您找到问题所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2011-06-18
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多