确定图像选择器的媒体类型是否为视频。

7

我曾看到过各种检查-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个回答

16

最好检查与特定UTI的一致性。

目前,iOS会告诉您它是“public.movie”,但明年会是什么呢?您会看到人们还会检查“public.video”。这样,您就硬编码了两种类型而不是一种。

但是,询问“这是一部电影吗?”比硬编码您认为iOS将返回的特定类型更好。有一种方法可以实现:

NSString *mediaType = info[UIImagePickerControllerMediaType];
BOOL isMovie = UTTypeConformsTo((__bridge CFStringRef)mediaType,
                                kUTTypeMovie) != 0;
使用这种方法,如果返回的是电影(不管具体类型是什么),当mediaType代表电影时,isMovie应该为YES,因为所有电影都符合kUTTypeMovie。要更清楚一些,如果是kUTTypeVideo,它也会被识别为电影,因为kUTTypeVideo符合kUTTypeMovie
同样地,您可以检查返回的内容是否为图像:
NSString *mediaType = info[UIImagePickerControllerMediaType];
BOOL isImage = UTTypeConformsTo((__bridge CFStringRef)mediaType,
                                kUTTypeImage) != 0;

如果返回的是一个图片,isImage 应该被设置为 YES,因为所有图片都符合 kUTTypeImage 标准。

在此处可以查看苹果的(部分)类型树:统一类型标识符在符合层次结构中声明。您可以通过 shell 获取当前系统中所有 UTI 的列表和其符合情况,但这个列表可能不太实用:

/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。以下是来自苹果文档的摘录:

如果统一类型标识符与第二个类型相等或符合,则返回true。


1
不确定为什么这篇文章在 SO 上没有得到任何赞,它是我见过的最好的方法。 - Toby
我也喜欢你的方法。非常感谢这个解决方案。 - iWheelBuy
一旦你遇到这些API,它确实是唯一一个有任何意义的。 :) - Steven Fisher

2
我认为第一种方法UTTypeEqual和第二、三种方法(NSString比较)的区别在于处理CFStringRefsNSStrings的偏好问题。
第四种类型似乎是通过其实际字符串值引用kUTTypeMovie,这是绝对不应该做的,因为它是私有的,而且实际上可能会更改。除此之外,它与第二和第三种方法类似。
看起来你可能需要根据需要检查更多类型。
我可能会检查kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4
完整列表请参见UTType参考
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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接