如何找出 Lion 10.7 中 AVAudioPlayer 支持格式的所有音频文件?

Li *_*min 1 cocoa metadata spotlight

我想使用这样的代码。

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[query setSearchScopes: [NSArray arrayWithObject: [NSURL fileURLWithPath:@"/Users/Someone/Music" isDirectory:YES]]];
[query setPredicate: predicate];
...
...
Run Code Online (Sandbox Code Playgroud)

现在我该如何设置“谓词”来过滤掉那些格式不受支持的文件?

kMDItemCodezs,kMDItemMediaTypes,kMDItemContentType,kMDItemKind?
Run Code Online (Sandbox Code Playgroud)

我应该使用哪一种?Lion 10.7 中 AVAudioPlayer 支持的格式对应的这些属性的所有可能值是什么?非常感谢。

Nic*_*ley 6

要获取最受支持的格式列表,您可以AudioFileGetGlobalInfoAudioToolbox框架中使用以获取 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];
Run Code Online (Sandbox Code Playgroud)

在 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"
Run Code Online (Sandbox Code Playgroud)

不幸的是,UTI 没有为一些更晦涩的数据格式(例如.mp1/ .mp2)Core Audio 支持定义;如果您对上述子集感到满意,则只需使用 UTI。

然后将它们变成NSMetadataQuery( kMDItemContentTypefor kAudioFileGlobalInfo_AllUTIs)。:如果你想覆盖的格式休息,你可以通过HFS类型和扩展匹配kMDItemFSTypeCodekAudioFileGlobalInfo_AllHFSTypeCodes,和通配符匹配kMDItemFSNamekAudioFileGlobalInfo_AllExtensions。您可以使用afconvert -hf来显示这两个。

匹配 withNSMetadataQuery当然不会查看所有文件的内部,因此它仍然会找到使用.mp3扩展名重命名的文本文件。由于 Spotlight 确实尝试索引其他音频属性,您可以尝试检查kMDItemAudioBitRate等等;这些将在实际上不是音频文件的文件中丢失。根据您希望过滤的准确程度,您还可以尝试打开每个文件以查看它是否可播放。

  • 使用 API 是一个更好的主意,因为支持的格式将来可能会发生变化(无论好坏)。如上所述,您将需要构建一个查询来检查任何 UTI、类型代码或扩展名。 (2认同)