在iPhone上,我需要获取资源的路径。好的,完成了,但是当谈到CFURLCreateFromFileSystemRepresentation的事情时,我只是不知道如何解决这个问题。为什么会出现此错误?任何解决方案或解决方法都将受到高度赞赏。提前谢谢。
我已经看过以下示例,以便在iPhone上使用AudioQueue播放音频: SpeakHere,AudioQueueTools(来自SimpleSDK目录)和AudioQueueTest。我试着这样做,并尝试将难题放在一起。现在,我被困在这里。程序崩溃是因为上面的sndFile抛出的异常。
我正在使用AVAudioPlayer播放iPhone游戏中的所有声音。在真正的iPhone设备上,当播放声音时结果非常迟钝,所以我决定使用AudioQueue。
- (id) initWithFile: (NSString*) argv{
if (self = [super init]){
NSString *soundFilePath = [[NSBundle mainBundle]
pathForResource:argv
ofType:@"mp3"];
int len = [soundFilePath length];
char* fpath = new char[len];
//this is for changing NSString into char* to match
//CFURLCreateFromFileSystemRepresentation function's requirement.
for (int i = 0; i < [soundFilePath length]; i++){
fpath[i] = [soundFilePath characterAtIndex:i];
}
CFURLRef sndFile = CFURLCreateFromFileSystemRepresentation
(NULL, (const UInt8 *)fpath, strlen(fpath), false);
if (!sndFile) {
NSLog(@"sndFile error");
XThrowIfError (!sndFile, "can't parse file path");
}
}
答案 0 :(得分:11)
为什么需要CFURL?
如果你在其他地方有一个需要CFURL的方法,你可以简单地使用NSURL,这要归功于免费桥接。所以要创建NSURL,你只需要:
NSString * soundFilePath = [[NSBundle mainBundle]
pathForResource:argv
ofType:@"mp3"];
NSURL *soundURL = [NSURL fileURLWithPath:soundFilePath];
一般来说,如果你发现自己使用的是CF对象,那么你可能做错了。
答案 1 :(得分:0)
我不确定这是否会消除您的异常,但有一种更简单的方法可以将NSString
转换为char
数组。以下是我将如何编写此方法:
- (id) initWithFile:(NSString*) argv
{
if ((self = [super init]) == nil) { return nil; }
NSString * soundFilePath = [[NSBundle mainBundle]
pathForResource:argv
ofType:@"mp3"];
CFURLRef sndFile = CFURLCreateFromFileSystemRepresentation
(NULL, [soundFilePath UTF8String],
[soundFilePath length], NO);
if (!sndFile) { NSLog(@"sndFile error"); }
XThrowIfError (!sndFile, "can't parse file path");
...
}
或者,由于CFURL
与NSURL
是“免费桥接”,您只需执行以下操作:
- (id) initWithFile:(NSString*) argv
{
if ((self = [super init]) == nil) { return nil; }
NSString * soundFilePath = [[NSBundle mainBundle]
pathForResource:argv
ofType:@"mp3"];
NSURL * sndFile = [NSURL URLWithString:[soundFilePath
stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding]];
if (!sndFile) { NSLog(@"sndFile error"); }
XThrowIfError (!sndFile, "can't parse file path");
...
}