我认为我的问题是如何预先配置我的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模拟器上测试我的代码。
答案 0 :(得分:0)
您添加到项目中的文件最终会出现在应用程序的Bundle目录中,而不是文档或库/缓存中。对于模拟器,此应用程序包通常位于Xcode Build或DerivedData目录中,而不是模拟器应用程序支持区域。
获得良好路径的一种简单方法是,在应用程序的第一次运行期间,在应用程序的沙箱文档或库/缓存目录中创建一些微小的虚拟文件,并使用一些唯一的名称。退出应用程序,删除此文件创建代码,然后在Mac上使用Spotlight查找虚拟文件。替换你想要的任何东西。然后运行应用程序,使用相同路径的代码读取来创建虚拟文件。
答案 1 :(得分:0)
您可以使用:
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
获取项目中包含的文件。