How to check MPMediaItem for MPMediaType audio only?

I expect that I need bitwise comparisons, but I don't understand how this is done in Objective-C syntax. The following is the definition of MPMediaType.

What I need to do is to ensure that MPMediaItem is not video at all, because AVAssetReader is choking on video files, despite filtering in MPMediaTypeAnyAudio with my media query.

How can I guarantee that MPMediaItem is one of only audio types?

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; 
+6
source share
2 answers

To get all the music tracks from the music library, try:

 MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeMusic] forProperty:MPMediaItemPropertyMediaType]; MPMediaQuery *query = [[MPMediaQuery alloc] init]; [query addFilterPredicate:predicate]; NSArray *items = [query items]; 

To extract music, audio books, and podcasts:

 MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue [NSNumber numberWithInteger:MPMediaTypeMusic | MPMediaTypePodcast | MPMediaTypeAudioBook] forProperty:MPMediaItemPropertyMediaType comparisonType:MPMediaPredicateComparisonContains]; 
+9
source

I found that the MPMediaQuery predicate on MPMediaTypeAnyAudio is not enough. So, I checked the following media type check instead, and this is the best way to prevent the distribution of video content.

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

I found that the actual values ​​from the media type enumeration had these values ​​that allow me to use this simple integer comparison.

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

Source: https://habr.com/ru/post/903318/


All Articles