Cocoa 如何查找Lion 10.7中AVAudioPlayer支持其格式的所有音频文件?
我想使用这样的代码Cocoa 如何查找Lion 10.7中AVAudioPlayer支持其格式的所有音频文件?,cocoa,metadata,spotlight,Cocoa,Metadata,Spotlight,我想使用这样的代码 NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; [query setSearchScopes: [NSArray arrayWithObject: [NSURL fileURLWithPath:@"/Users/Someone/Music" isDirectory:YES]]]; [query setPredicate: predicate]; ... ... 现在我该如何将“谓词”设置为过滤掉那些格式不受支
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中支持的格式相对应的这些姿态的所有可能值是什么?非常感谢。使用
kMDItemContentTypeTree
,然后。这将匹配任何音频文件,忽略电影文件。如果要包括电影文件,请搜索音频类型所符合的(从其派生)
编辑:这将匹配所有已知的音频类型,无论核心音频(更不用说AVAudioPlayer)是否可以播放它们。Nicholas Riley的解决方案更好。使用
kMDItemContentTypeTree
,和。这将匹配任何音频文件,忽略电影文件。如果要包括电影文件,请搜索音频类型所符合的(从其派生)
编辑:这将匹配所有已知的音频类型,无论核心音频(更不用说AVAudioPlayer)是否可以播放它们。Nicholas Riley的解决方案更好。要获得最受支持的格式列表,您可以使用
AudioToolbox
框架中的AudioFileGetGlobalInfo
获得核心音频支持的UTI(使用kAudioFileGlobalInfo\u AllUTIs
):
在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
)核心音频支持定义;如果您对上述子集感到满意,那么只需使用UTI即可
然后将它们转换为NSMetadataQuery
(kMDItemContentType
forkAudioFileGlobalInfo\u AllUTIs
)。如果您想涵盖其余格式,可以按HFS类型和扩展名进行匹配:Kmdetemfstypecode
用于kAudioFileGlobalInfo\u allhfstypecode
,通配符匹配Kmdetemfsname
用于kAudioFileGlobalInfo\u AllExtensions
。您可以使用afconvert-hf
来显示这两个选项
与
NSMetadataQuery
匹配当然不会查找所有文件,因此仍会找到以.mp3
扩展名重命名的文本文件。由于Spotlight会尝试为其他音频属性编制索引,所以您可以尝试检查kMDItemAudioBitRate
等等;这些将丢失在实际上不是音频文件的文件中。根据过滤的准确程度,您还可以尝试打开每个文件以查看其是否可播放。要获得最受支持的格式列表,您可以使用AudioToolbox
框架中的AudioFileGetGlobalInfo
获取核心音频支持的UTI(使用kAudioFileGlobalInfo\u AllUTIs
):
在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
)核心音频支持定义;如果您对上述子集感到满意,那么只需使用UTI即可
然后将它们转换为NSMetadataQuery
(kMDItemContentType
forkAudioFileGlobalInfo\u AllUTIs
)。如果您想涵盖其余格式,可以按HFS类型和扩展名进行匹配:Kmdetemfstypecode
用于kAudioFileGlobalInfo\u allhfstypecode
,通配符匹配Kmdetemfsname
用于kAudioFileGlobalInfo\u AllExtensions
。您可以使用afconvert-hf
来显示这两个选项
与
NSMetadataQuery
匹配当然不会查找所有文件,因此仍会找到以.mp3
扩展名重命名的文本文件。由于Spotlight会尝试为其他音频属性编制索引,所以您可以尝试检查kMDItemAudioBitRate
等等;这些将丢失在实际上不是音频文件的文件中。根据过滤的准确程度,您还可以尝试打开每个文件以查看其是否可播放。[NSPredicate predicateWithFormat:@“public.audio in%@”,kMDItemContentTypeTree];这可以过滤掉那些格式不受支持的文件吗?不,因为您传递的是名称,而不是集合,所以中的将无法工作。根据谓词编程指南:“Spotlight要求比较子句采用“KEY operator VALUE
”的形式,并且不接受“VALUE operator KEY
”。正确的格式字符串只是kMDItemContentTypeTree==%@
(以kUTTypeAudio
作为参数传递)。我知道==
看起来很奇怪,左边是数组值键,右边是字符串,但元数据框架做的事情是正确的。[NSPredicate predicateWithFormat:@“public.audio in%@”,kMDItemContentTypeTree];这可以过滤掉那些格式不受支持的文件吗?不,因为您传递的是名称,而不是集合,所以
中的将无法工作。根据谓词编程指南:“Spotlight要求比较子句采用“KEY operator VALUE
”的形式,并且不接受“VALUE operator KEY
”。正确的格式字符串只是kMDItemContentTypeTree==%@
(以kUTTypeAudio
作为参数传递)。我知道==
看起来很奇怪,左边是一个数组值键,右边是一个字符串,但是元数据框架做了正确的事情。我在CoreAudioTypes.h
中找到了所有支持的格式ID,我能把它们转换成NSMetadataQuery
吗?如果可以,怎么做?谢谢,Nicholas Riley。使用API是一个更好的主意,因为支持的格式将来可能会改变(无论是好是坏)。您将需要构造一个查询来检查任何UTI、类型代码或扩展,如我上面所述。我在CoreAudioTypes.h
中找到了所有受支持的格式ID,我可以将它们转换为NSMetadataQuery
?如果可以,怎么做?谢谢,尼古拉斯·莱利,这是一个非常好的选择