3

を使用し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 の場合) と同じように、曲のタイトル (およびアルバムのアートワークなど) を表示できます。

曲ファイルはApple MPEG 4 Audio、iTunes Store から購入したファイルです。

asset.commonMetadata利用可能なメタデータがあるのに空の配列を返すのはなぜですか?

4

2 に答える 2

0

ダウンロードした m4b オーディオ ファイルでも同じ問題が発生していました。AVURLAsset では、URL 文字列が '.m4b' で終わる必要があることがわかりました (他のオーディオ拡張子も機能すると思います)。http://source.com/download.php?id=12345のような URL をそのまま使用することはできません。それ以外の場合、asset.commonMetaData は空の配列を返すだけです。これが iTunes の assetURL の問題かどうかはわかりませんが、簡単に確認できます。

于 2014-02-11T18:40:41.430 に答える
0

私のために働いた唯一の解決策:

AudioToolbox.frameworkそのようなファイルからメタデータを取得するために使用します。つまり、AudioFileGetProperty関数を使用します。

それは本当のバグのようAVFoundationです…

于 2014-06-30T13:43:39.470 に答える