【发布时间】:2009-07-22 08:17:21
【问题描述】:
这个问题听起来可能很愚蠢,但问题是:我正在学习如何使用音频队列,而我所举的示例 (aqtest) 对我来说是一个很好的指南,直到我最近发现 aqtest 是不适用于 iPhone。 (愚蠢的我)我在互联网上服务,发现没有适用于iPhone的FSRef。
如果可能,我想找到一种解决 FSRef 问题的方法。那么问题来了:我可以使用其他东西来代替 iPhone SDK 上存在的 FSRef 吗?还是我错过了什么?
【问题讨论】:
这个问题听起来可能很愚蠢,但问题是:我正在学习如何使用音频队列,而我所举的示例 (aqtest) 对我来说是一个很好的指南,直到我最近发现 aqtest 是不适用于 iPhone。 (愚蠢的我)我在互联网上服务,发现没有适用于iPhone的FSRef。
如果可能,我想找到一种解决 FSRef 问题的方法。那么问题来了:我可以使用其他东西来代替 iPhone SDK 上存在的 FSRef 吗?还是我错过了什么?
【问题讨论】:
FSRefs 在手机上根本不可用。 FSRefs 是一种表示文件引用的方式,在大多数情况下,首选的替代方法是带有文件的 NSURL:scheme。
话虽如此,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本身在手机上是不行的,毕竟不支持在设备上运行命令行工具。
【讨论】:
您看过 aqplay.cpp 中的代码吗?这是我从中获取的一些示例代码
核心音频 -> SimpleSDK -> AudioQueueTools。
它使用CFURLRef 打开它的AudioFileID。
大部分代码看起来应该为 iPhone 编译。
【讨论】: