Edited at

AVFoundation が対応する拡張子を集合形式で取得する

More than 3 years have passed since last update.

AVFoundation が対応する種類は [AVURLAsset audiovisualTypes] で取得できるが、UTI 形式なのでこれを拡張子として取得するコードを書く


実装

UTTypeCopyPreferredTagWithClass で UTI から拡張子を取得できるので、[AVURLAsset audiovisualTypes] からそれぞれ UTI を拡張子に変換して集合にする

/* ARC 前提 */

static NSSet *supportedExtensionsByAVFoundation() {
NSArray *supportedUTITypes = [AVURLAsset audiovisualTypes];
NSMutableSet *supportedExtensions = [NSMutableSet setWithCapacity:[supportedUTITypes count]];
for (NSString *supportedUTI in supportedUTITypes) {
/* UTI 形式から拡張子を取得 */
NSString *extension = (__bridge_transfer NSString *) UTTypeCopyPreferredTagWithClass((__bridge CFStringRef) supportedUTI, kUTTagClassFilenameExtension);
if (extension != nil) {
[supportedExtensions addObject:extension];
}
}
return supportedExtensions;
}

この場合音声形式と動画形式両方取得出来てしまうので、どちらか片方のみにしたい場合は UTTypeConformsTo を使う

/* 取得した UTI は動画形式であるか? */

UTTypeConformsTo((__bridge CFStringRef) supportedUTI, kUTTypeVideo);
/* 取得した UTI は音声形式であるか? */
UTTypeConformsTo((__bridge CFStringRef) supportedUTI, kUTTypeAudio);

iOS で使う場合は MobileCoreServices.framework をリンクする必要がある


Apple が提供する UTI について

UTI (Uniform Type Identifiers) とは Apple が採用する MIME の代替として作られた識別子の形式であり、UTTypeConformsTo からわかる通り継承の概念を持つ