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
からわかる通り継承の概念を持つ