2013-03-25 89 views
6

我已經看過檢查-imagePickerController:didFinishPickingMediaWithInfo:中返回的媒體類型是否爲視頻的各種方法。例如,我的方式:確定圖像選擇器媒體類型是否爲視頻

- (void)imagePickerController:(UIImagePickerController *)imagePicker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    if (UTTypeEqual(kUTTypeMovie, 
    (__bridge CFStringRef)[info objectForKey:UIImagePickerControllerMediaType])) 
    { 
     // ... 
    } 
} 

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) { 

if ([mediaType isEqualToString:(NSString *)kUTTypeVideo] || 
    [mediaType isEqualToString:(NSString *)kUTTypeMovie]) 

if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) 
     == kCFCompareEqualTo) 

if ([mediaType isEqualToString:@"public.movie"] 

每個人似乎都有不同的做法。什麼是檢查媒體類型的推薦方法?最好採用包括「所有圖像類型」或「所有視頻類型」的方式。

回答

2

我會說第一方法UTTypeEqual和第二和第三個方法(NSString比較)之間的差,是優選的在處理CFStringRefsNSStrings的問題。

第四種類型似乎是以其實際的字符串值引用kUTTypeMovie,您應該絕對不要這樣做,因爲它是私有的,並且可能實際發生更改。除此之外,它就像第二種和第三種方法一樣。

它看起來好像你可能想檢查一些更多的類型,這取決於你想要/需要的徹底程度。

我可能會檢查kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4

UTType Reference

kUTTypeAudiovisualContent 
An abstract type identifier for audio and/or video content. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMovie 
An abstract type identifier for a media format which may contain both video and audio. Corresponds to what users would label a "movie" 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeVideo 
An abstract type identifier for pure video data(no audio). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeAudio 
An abstract type identifier for pure audio data (no video). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeQuickTimeMovie 
The type identifier for a QuickTime movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG 
The type identifier for a MPEG-1 or MPEG-2 movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG4 
The type identifier for a MPEG-4 movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMP3 
The type identifier for MP3 audio. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG4Audio 
The type identifier for a MPEG-4 audio layer (.m4a, or the MIME type audio/MP4). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeAppleProtectedMPEG4Audio 
The type identifier for Apple protected MPEG4 format (.m4p, iTunes music store format). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 
13

全部列表這將是更好地與一個特定的UTI檢查一致性代替。

現在,iOS告訴你它的一個public.movie,但明年會說些什麼呢?你會看到人們也在檢查public.video。太棒了,所以你已經硬編碼了兩種類型而不是一種。

但問問「這是一部電影嗎?」不是更好嗎?而不是硬編碼你認爲iOS會返回的具體類型?有一個辦法做到這一點:

NSString *mediaType = info[UIImagePickerControllerMediaType]; 
BOOL isMovie = UTTypeConformsTo((__bridge CFStringRef)mediaType, 
           kUTTypeMovie) != 0; 

使用這種方法,isMovieYES如果返回的電影(不管是哪個返回特定類型),如果mediaType的代表一部電影,因爲所有的電影從kUTTypeMovie一致。要非常清楚,如果它是kUTTypeVideo這也會將其識別爲電影,因爲kUTTypeVideo符合kUTTypeMovie

同樣的,你可以檢查,看看如果返回的是一個形象:

NSString *mediaType = info[UIImagePickerControllerMediaType]; 
BOOL isImage = UTTypeConformsTo((__bridge CFStringRef)mediaType, 
           kUTTypeImage) != 0; 

isIamge應該YES如果返回的圖像,因爲所有的圖片符合kUTTypeImage

請參閱Apple的(部分)類型樹:Uniform Type Identifiers Are Declared in a Conformance Hierarchy。你可以得到當前系統中承認,其從外殼,符合所有尿路感染的那麼有用,但更完整的列表:

/System/Library/Frameworks/CoreServices.framework/Frameworks\ 
/LaunchServices.framework/Versions/A/Support/lsregister -dump 

特別的,你可以看到public.video的定義是這樣的:

-------------------------------------------------------- 
type id:   8344 
    uti:   public.video 
    description: video 
    flags:   exported active core apple-internal trusted 
    icon:   
    conforms to: public.movie 
    tags:   
-------------------------------------------------------- 

請注意,如果類型相同,UTTypeConformsTo返回true。從Apple的文檔:

如果統一類型標識符等於或符合第二個類型,則返回true。

+1

不知道這是如何坐在這裏沒有任何票多久。這是我見過的最好的方法。 – Toby 2015-05-21 02:25:13

+0

我也喜歡你的方法。 Thx很多這個解決方案。 – iWheelBuy 2015-10-14 08:11:23

+0

一旦你偶然發現這些API,它確實是唯一一個有意義的東西。 :) – 2016-01-15 15:20:14