Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何查找Lion 10.7中AVAudioPlayer支持其格式的所有音频文件?_Cocoa_Metadata_Spotlight - Fatal编程技术网

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
for
kAudioFileGlobalInfo\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
for
kAudioFileGlobalInfo\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
?如果可以,怎么做?谢谢,尼古拉斯·莱利,这是一个非常好的选择