我想我的问题是如何预配置我的iOS沙箱,使其中包含音频文件,以便在构建后立即测试我的音频队列结构。
我正在开发一款iOS应用程序,播放我在服务器上托管的流中的音频。在我解决如何从HTTP流中获取数据之前,我想我应该先使用音频队列服务从手机中播放文件。我的理解是,如果你想同时播放多个音频流,你必须使用音频队列,而不是AVPlayer或任何其他服务。
我的问题是我无法配置我的CFURLRef,因为我找不到我的文件。
AudioBufferPlayer *player = (AudioBufferPlayer*) inUserData;
if (player.playing) {
NSString *path = @"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/";
const char *filePath = [path cStringUsingEncoding:[NSString defaultCStringEncoding]];
CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)filePath, strlen(filePath), false);
OSStatus result = AudioFileOpenURL(audioFileURL, kAudioFileReadPermission, kAudioFileCAFType, player.mAudioFile);
UInt32 numBytesReadFromFile;
UInt32 numPackets = player.mNumPacketsToRead;
AudioFileReadPackets(
*(player.mAudioFile),
false,
&numBytesReadFromFile,
NULL,
player.mCurrentPacket,
&numPackets,
inBuffer->mAudioData
);
if (numPackets > 0) {
inBuffer->mAudioDataByteSize = numBytesReadFromFile;
AudioQueueEnqueueBuffer(inAudioQueue, inBuffer, 0, NULL);
player.mCurrentPacket += numPackets;
}
我在AudioFileReadPackets上收到一个错误,说EXC_BAD_ACCESS,此时我的OSStatus结果设置为-50,所以我认为我的AudioFileOpenURL调用失败了。
我认为我的问题是我的*路径在这一点上并没有真正指向任何东西。问题是当我去的时候
@"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/"
我的四个选项是Demo3、Documents、Library和temp。这些选项都没有我添加到项目中的quick.caf文件。
TL,DR-除非我忽略了什么,否则我相信我正在询问如何在构建之前将音频文件添加到我的沙盒中,以便在iPhone模拟器上测试我的代码
添加到项目中的文件最终会出现在应用程序的Bundle目录中,而不是Documents或Library/Caches。对于模拟器,这个应用程序包通常位于Xcode Build或DerivedData目录中,而不是模拟器应用程序支持区域。
获得一个好路径的一个简单方法是,在应用程序的第一次运行过程中,在应用的沙盒Documents或Library/Caches目录中创建一些具有唯一名称的微小伪文件。退出应用程序,删除此文件创建代码,然后在Mac上使用Spotlight查找伪文件。替换为您想要的任何内容。然后运行应用程序,从用于创建伪文件的相同路径读取代码。
您可以使用:
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
以获取包含在项目中的文件。