3

我正在使用 aMPMediaPickerController使用户能够从设备的 iPod 库中挑选歌曲。然后我将这些歌曲放入一个数组(在这种情况下playerQueue)并使用一个AVPlayer实例来播放一首又一首的歌曲:

- (void)setQueueWithItemCollection:(MPMediaItemCollection *)theCollection {

    for (MPMediaItem *theMediaItem in theCollection.items) {

        NSURL *mediaURL = [theMediaItem valueForProperty:MPMediaItemPropertyAssetURL];
        AVPlayerItem *thePlayerItem = [AVPlayerItem playerItemWithURL:mediaURL];

        // Don't add protected tracks to queue as they cannot be played
        if (!thePlayerItem.asset.hasProtectedContent && thePlayerItem.asset.isPlayable) [self.playerQueue addObject:thePlayerItem];

        // Further implementation
    }
}

现在我使用这个代码片段(带AVPlayer *musicPlayer)获得歌曲标题:

AVPlayerItem *currentItem = self.musicPlayer.currentItem;
AVAsset *asset = currentItem.asset;

// Further implementation

NSLog(@"DEBUG: Meta data: %@", asset.commonMetadata);

NSArray *titles = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon];

大多数情况下,这没有任何问题。但也有asset.commonMetadata返回空数组的歌曲。但是,我 iPhone 上的音乐应用程序能够像 iTunes(在 Mac 上)一样显示歌曲标题(和专辑封面等)。

歌曲文件是Apple MPEG 4 Audio从 iTunes Store 购买的文件。

asset.commonMetadata即使有可用的元数据,为什么返回一个空数组?

4

2 回答 2

0

我在下载 m4b 音频文件时遇到了同样的问题。原来 AVURLAsset 要求 URL 字符串以“.m4b”结尾(我怀疑其他音频扩展也可以)。如果 URL 类似于http://source.com/download.php?id=12345 ,则不能按原样使用 URL 。否则,asset.commonMetaData 只会返回一个空数组。我不知道这是否是 iTunes 资产 URL 的问题,但很容易检查。

于 2014-02-11T18:40:41.430 回答
0

唯一对我有用的解决方案:

用于AudioToolbox.framework从此类文件中检索元数据,即使用AudioFileGetProperty函数。

这似乎是一个真正的错误AVFoundation……

于 2014-06-30T13:43:39.470 回答