我将 const char * 值传递给函数,该函数使用 AudioFileOpenURL 方法打开指定的音频文件。所以我需要一个CFURLRef值。但我正在使用相对路径,比如 声音/ click.wav 但在这种情况下 AudioFileOpenURL 无法打开文件(找不到文件错误)。所以我需要扩展相对路径并将完整路径传递给此方法。我找到的最佳解决方案是: 获取bundle url,获取资源文件夹url,从CFString构造CFURL,这是从字节构造的.....非常讨厌。
CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef bundleUrl = CFBundleCopyBundleURL(bundle);
CFURLRef resUrl = CFBundleCopyResourcesDirectoryURL(bundle);
CFStringRef cfsName = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8*)inFilePath, strlen(inFilePath), kCFStringEncodingASCII, 1);
CFMutableStringRef fileName = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, CFURLGetString(bundleUrl));
CFStringAppend(fileName, CFURLGetString(resUrl));
CFStringAppend(fileName, cfsName);
CFURLRef theURL = CFURLCreateWithString(kCFAllocatorDefault, fileName, 0);
CFRelease(fileName);
CFRelease(cfsName);
CFRelease(resUrl);
CFRelease(bundleUrl);
有更简单的方法吗?因为在iPhone上有下一个代码:
CFURLRef theURL = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8*)inFilePath, strlen(inFilePath), false);
像魅力一样工作。
答案 0 :(得分:1)
大多数CF字符串创建繁忙工作是因为你是从C字符串开始的。从literal CFString或NSString开始,你会更开心。
将子路径作为CF / NSString传递给函数后,使用CFURLCreateCopyAppendingPathComponent
将该子路径附加到bundle的资源目录URL。生成的URL是声音文件的URL。