我正在使用MPMediaPickerController
使用户能够从设备的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上)一样显示歌曲标题(和专辑插图等)。
歌曲文件是从iTunes Store购买的Apple MPEG 4 Audio
文件。
为什么即使有可用的元数据,asset.commonMetadata
也会返回一个空数组?
答案 0 :(得分:0)
我在下载的m4b音频文件时遇到了同样的问题。事实证明,AVURLAsset要求URL字符串以'.m4b'结尾(我怀疑其他音频扩展可以工作)。如果类似于http://source.com/download.php?id=12345,则无法使用该URL。否则,asset.commonMetaData只返回一个空数组。我不知道这是否是iTunes assetURL的问题,但它很容易检查。
答案 1 :(得分:0)
唯一对我有用的解决方案:
使用AudioToolbox.framework
从这些文件中检索元数据,即使用AudioFileGetProperty
函数。
AVFoundation
......