我想使用这样的代码。
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes: [NSArray arrayWithObject: [NSURL fileURLWithPath:@"/Users/Someone/Music" isDirectory:YES]]];
[query setPredicate: predicate];
...
...
现在我如何设置“谓词”到 过滤掉格式不受支持的文件?
kMDItemCodezs,kMDItemMediaTypes,kMDItemContentType,kMDItemKind?
我应该使用哪一个?这些属性的所有可能值与Lion 10.7中AVAudioPlayer中支持的格式相对应的是什么?非常感谢。
答案 0 :(得分:4)
要获取大多数支持的格式列表,您可以使用AudioFileGetGlobalInfo
框架中的AudioToolbox
来获取Core Audio支持的UTI(使用kAudioFileGlobalInfo_AllUTIs
):
UInt32 size;
NSArray *all;
OSStatus err;
err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AllUTIs, 0, NULL, &size);
if (err == noErr)
err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AllUTIs, 0, NULL, &size, &all);
if (err == noErr)
NSLog(@"UTIs: %@", all);
[all release];
在10.7,这给了我:
"public.aiff-audio",
"public.ulaw-audio",
"org.3gpp.adaptive-multi-rate-audio",
"com.microsoft.waveform-audio",
"public.3gpp2",
"com.apple.coreaudio-format",
"public.3gpp",
"public.mp3",
"public.au-audio",
"public.mpeg-4-audio",
"public.mpeg-4",
"com.apple.m4a-audio",
"public.aifc-audio"
不幸的是,UTI没有为某些更加模糊的数据格式定义(例如.mp1
/ .mp2
)Core Audio支持;如果您对上述子集感到满意,那么只需使用UTI。
然后将其转换为NSMetadataQuery
(kMDItemContentType
kAudioFileGlobalInfo_AllUTIs
)。如果您想要覆盖其余格式,则可以按照HFS类型和扩展名进行匹配:kMDItemFSTypeCode
用于kAudioFileGlobalInfo_AllHFSTypeCodes
,kMDItemFSName
用于kAudioFileGlobalInfo_AllExtensions
的通配符匹配。您可以使用afconvert -hf
来显示这两者。
与NSMetadataQuery
匹配当然不会查看所有文件,因此它仍然会找到使用.mp3
扩展名重命名的文本文件。由于Spotlight确实尝试索引其他音频属性,您可以尝试检查kMDItemAudioBitRate
等等;这些文件实际上不是音频文件时会丢失。根据您希望过滤的准确程度,您还可以尝试打开每个文件以查看它是否可播放。
答案 1 :(得分:1)
使用kMDItemContentTypeTree
和the audio type。这将匹配任何音频文件,忽略电影文件。如果要包含电影文件,请搜索音频类型符合({降序)的the audio-visual content type。
编辑:这将匹配所有已知的音频类型,无论Core Audio(更不用说AVAudioPlayer)是否可以播放它们。 Nicholas Riley的解决方案更好。