0

我想我的问题是如何预先配置我的 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 调用失败。

我认为我的问题是我的 *path 在这一点上并没有真正指向任何东西。问题是当我去

@"/Users/acopp/Library/Application Support/iPhone Simulator/5.1/Applications/F9CA1197-A661-4B2F-9B42-68A991F61B19/"

我的四个选项是 Demo3、Documents、Library 和 temp。这些都没有我添加到项目中的 quick.caf 文件。

TL,DR - 除非我忽略了某些东西,否则我相信我会在构建之前询问如何将音频文件添加到我的沙箱中,以便我可以在 iPhone 模拟器上测试我的代码。

4

2 回答 2

0

添加到项目中的文件最终位于应用程序的 Bundle 目录中,而不是 Documents 或 Library/Caches。对于 Simulator,此应用程序包通常位于 Xcode Build 或 DerivedData 目录中,而不是 Simulator Application Support 区域。

获得良好路径的一种简单方法是,在应用程序的第一次运行期间,在应用程序的沙箱 Documents 或 Library/Caches 目录中创建一些具有唯一名称的微小虚拟文件。退出应用程序,删除此文件创建代码,然后在 Mac 上使用 Spotlight 查找虚拟文件。用任何你想要的替换。然后运行应用程序,从用于创建虚拟文件的相同路径读取代码。

于 2012-07-17T18:44:17.287 回答
0

您可以使用 :

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];

获取项目中包含的文件。

于 2012-07-18T12:50:07.080 回答