问题可能听起来很愚蠢,但问题是这样的:我正在学习如何使用音频队列,我采取的例子(aqtest)对我来说一直很好,直到我最近发现aqtest是不适用于iPhone。 (愚蠢的我)我在互联网上服务,发现iPhone没有FSRef。
如果可能的话,我想找到一种解决FSRef问题的方法。所以问题就出现了:我可以使用其他东西而不是iPhone SDK上存在的FSRef吗?或者我错过了什么?
答案 0 :(得分:2)
手机上根本没有FSRefs。 FSRefs是一种重新调用文件引用的方法,对于大多数用途,首选的替换是带有file:scheme的NSURL。
话虽如此,iPhone肯定有一个SpeakHere示例,它不使用FSRefs。
至于aqtest,我认为你遇到问题的代码是:
FSRef fsref;
XThrowIfError(FSPathMakeRef(filePath, &fsref, NULL), "Input file not found");
XThrowIfError(AudioFileOpen(&fsref, fsRdPerm, 0, &myInfo.mAudioFile), "AudioFileOpen failed");
就像我说的,FSRef不再是处理文件引用的首选方式,并且在手机上不可用,NSURL是。因此,请切换到基于URL的版本:
NSString *pathString = [NSString stringWithCString: filePath];
if (!pathString) { printf("can't parse file path\n"); return; }
NSURL *url = [NSURL fileURLWithPath:pathString];
if (! url) { printf("can't make file url\n"); return; }
XThrowIfError(AudioFileOpenURL (url, kAudioFileReadPermission, 0/*inFileTypeHint*/, &myInfo.mAudioFil), "can't open file");
那应该在手机上工作,当然很多aqtest本身都无法在手机上运行,毕竟不支持在设备上运行命令行工具。
答案 1 :(得分:1)
你看过aqplay.cpp中的代码了吗?这是我从中抓取的一些示例代码 核心音频 - > SimpleSDK - > AudioQueueTools。
它使用CFURLRef
打开其AudioFileID
。
大多数代码看起来应该为iPhone编译。