Как проверить MPMediaItem для MPMediaType только аудио? - PullRequest
6 голосов
/ 07 декабря 2011

Я ожидаю, что мне нужно сделать побитовое сравнение, но мне неясно, как это делается в синтаксисе Objective-C.Определение перечисления MPMediaType приведено ниже.

Что мне нужно сделать, так это убедиться, что MPMediaItem вообще не является видео, потому что AVAssetReader подавляет видеофайлы, несмотря на фильтрацию в MPMediaTypeAnyAudio с моим медиазапросом.Как я могу убедиться, что MPMediaItem является одним из единственных типов аудио?

enum {
    // audio
    MPMediaTypeMusic        = 1 << 0,
    MPMediaTypePodcast      = 1 << 1,
    MPMediaTypeAudioBook    = 1 << 2,
    MPMediaTypeAudioITunesU = 1 << 3, // available in iOS 5.0
    MPMediaTypeAnyAudio     = 0x00ff,

    // video (available in iOS 5.0)
    MPMediaTypeMovie        = 1 << 8,
    MPMediaTypeTVShow       = 1 << 9,
    MPMediaTypeVideoPodcast = 1 << 10,
    MPMediaTypeMusicVideo   = 1 << 11,
    MPMediaTypeVideoITunesU = 1 << 12,
    MPMediaTypeAnyVideo     = 0xff00,

    MPMediaTypeAny          = ~0
};
typedef NSInteger MPMediaType;

Ответы [ 2 ]

9 голосов
/ 08 декабря 2011

Чтобы извлечь все музыкальные дорожки из музыкальной библиотеки, попробуйте:

MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeMusic] forProperty:MPMediaItemPropertyMediaType];

MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:predicate];

NSArray *items = [query items];

Чтобы извлечь музыку, аудиокниги и подкасты:

MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue [NSNumber numberWithInteger:MPMediaTypeMusic | MPMediaTypePodcast | MPMediaTypeAudioBook] forProperty:MPMediaItemPropertyMediaType comparisonType:MPMediaPredicateComparisonContains];
4 голосов
/ 13 декабря 2011

Я обнаружил, что предиката MPMediaQuery для MPMediaTypeAnyAudio было недостаточно. Поэтому вместо этого я проверил следующую проверку типа носителя, и это лучший способ предотвратить проникновение видеоконтента.

    NSInteger mediaType = [[aMediaItem valueForProperty:MPMediaItemPropertyMediaType] intValue];
    if (mediaType <= MPMediaTypeAnyAudio) { 
        return TRUE;
    }

Я обнаружил, что фактические значения из перечисления типов носителей имеют эти значения, которые позволяют мне использовать это простое целочисленное сравнение.

MPMediaTypeMusic: 1
MPMediaTypePodcast: 2
MPMediaTypeAudioBook: 4
MPMediaTypeAudioITunesU: 8 (iOS 5)
MPMediaTypeAnyAudio: 255
MPMediaTypeMovie: 256
MPMediaTypeTVShow: 512
MPMediaTypeVideoPodcast: 1024
MPMediaTypeMusicVideo: 2048
MPMediaTypeVideoITunesU: 4096
MPMediaTypeAnyVideo: 65280
...