2013-03-25 45 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

相关问题