0

我正在尝试使用 AudioToolbox 的扩展音频文件API 在 OSX 上读取 CAF 文件。

打开文件工作正常,但是,我需要访问UUID 块,并且我找不到有关如何执行此操作的任何参考(或​​如何访问文件的任何标头块)

当然,必须有一种方法可以做到这一点,而无需我自己解析文件。

PS:我已经可以使用 libsndfile 做到这一点,但我想找到一种方法来仅使用 OSX 附带的组件来做到这一点。

我已经尝试ExtAudioFileGetProperty()使用ExtAudioFilePropertyID设置为“uuid”进行调用,但这似乎不起作用。

4

1 回答 1

1

事实证明,诀窍是不要使用 ExtAudio API 来访问像 UUID 块这样的低级功能。(如果您需要通过 ExtAudio API 访问文件,可以从 AudioFileID 创建一个 ExtAudioHandle。)

最后我使用了这样的东西:

AudioFileID fileID;
ExtAudioFileRef extFile;

OSStatus err = AudioFileOpenURL((CFURLRef)inURL, kAudioFileReadPermission, 0, &fileID);
if(noErr!=err)return;
err = ExtAudioFileWrapAudioFileID (fileID, false, &extFile); // in case we *also* want to access the file via ExtAudio
if(noErr!=err)return;

for(index=0; ; index++) {
  UInt32 size=0;
  char*data=NULL;

  OSStatus err = AudioFileGetUserDataSize (fileID,'uuid',index,&size);
  if(noErr!=err)break;   // check whether we were able to read the chunksize
  if(0==size)continue;    // check whether there is some payload in the uuid chunk

  data=calloc(size, 1);
  if(!data)continue;
  err = AudioFileGetUserData (fileID, 'uuid', index, &size, data);
  if(noErr!=err){free(data); break;}   // check whether we were able to read the chunksize
  /* ... */
  free(data);
}
ExtAudioFileDispose(extFile);
AudioFileClose(fileID);
于 2012-06-19T07:19:25.990 回答