【问题标题】:Determine if image picker media type is video确定图像选择器媒体类型是否为视频
【发布时间】:2013-03-25 16:15:35
【问题描述】:

我见过各种检查-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"]

似乎每个人都有不同的做法。检查媒体类型的推荐方法是什么?最好使用包含“所有图像类型”或“所有视频类型”的方式。

【问题讨论】:

    标签: ios cocoa-touch uiimagepickercontroller uti


    【解决方案1】:

    最好用特定的 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;
    

    如果返回图像,isIamge 应该是YES,因为所有图像都符合kUTTypeImage

    在此处查看 Apple 的(部分)类型树:Uniform Type Identifiers Are Declared in a Conformance Hierarchy。您可以通过以下方式获得一个不太有用但更完整的系统当前识别的所有 UTI 列表及其与 shell 的一致性:

    /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。

    【讨论】:

    • 不知道这是怎么坐在这里这么久没有任何赞成票的。这是我在 SO 上见过的最好的方法。
    • 我也喜欢你的方法。非常感谢这个解决方案。
    • 一旦你偶然发现了这些 API,它确实是唯一有意义的。 :)
    【解决方案2】:

    我想说第一种方法UTTypeEqual与第二种和第三种方法(NSString比较)之间的区别是处理CFStringRefsNSStrings时的偏好问题。

    第 4 种类型似乎是通过其实际字符串值引用 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.
    

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多