我正在尝试播放iPhone程序中的声音文件。
以下是代码:
NSString *path = [[NSBundle mainBundle] pathForResource:@"play" ofType:@"caf"];
NSFileHandle *bodyf = [NSFileHandle fileHandleForReadingAtPath:path];
NSData *body = [bodyf availableData];
NSLog( @"length of play.caf %d",[body length] );
NSURL *url = [NSURL fileURLWithPath:path isDirectory:NO];
NSLog( [url description] );
NSLog( @"%d", AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID) );
第一个NSLog是检查我是否有权访问该文件(我做过),第二个NSLog是显示文件URL,第三个NSLog返回-1500“发生了未指定的错误。”
对于第二个NSLog,我得到以下输出:
file:// localhost / Users / alan / Library / Application敲慬楴敶楲杮杮pport / / i蒠⽳⾅獕⽳⽳⽳湡䰯䰯䄯䄯䄯楬楴楴匠匠匠匠桐桐汤桐汤枫畭慬潴⽲獕牥䄯灰楬惯楴汤⽳䙂㕅㡂㤱䌭䐳ⴸ䐴䙃㠭㍃ⴷ䍁㈶㠵䙁㤴㈰䰯捯瑡䵥灡⽰汰祡挮晡imulator /用户/应用/ BFE5B819 -C3D8-4DCF-8C37-AC6258AF4902 / LocateMe.app / play.caf
这可能是由于我对“描述”方法的误解,或者这导致了这个问题。
知道出了什么问题吗?
答案 0 :(得分:3)
NSLog的第一个参数是格式字符串;您将[URL description]
作为格式字符串传递给第二次使用NSLog。这很糟糕,因为如果URL的描述包含任何%
字符,那么它将最终从堆栈中打印随机内容。
相反,写一下
NSLog(@"%@", URL);
您甚至不需要在这里使用-description
; NSLog会自动为你调用它,因为%@
表示“一个对象”,而不是“一个NSString”,它足够聪明,可以为你做正确的事。
答案 1 :(得分:3)
此外,似乎iPhone模拟器不喜欢播放(systemSound)超过5秒的声音。我有同样的问题,因为应用程序几乎总是在启动systemSound。
我在模拟器上工作的其中一个应用程序不会播放声音,但设备会播放。后来我发现模拟器和处理声音的方式有一些奇怪的限制。我向Apple提交了一个错误。希望这将通过发布iPhone SDK 3.0来解决。
答案 2 :(得分:1)
对此进行更新。
我拿到了钥匙,允许我在设备上运行我的应用程序。
我发现当应用在设备上运行时,我的.caf文件已成功播放。
然后我尝试了各种替代方案。
60秒的.wav文件无法在模拟器和设备上运行。
5秒长的.wav文件可以在模拟器上运行,但不能在设备上运行。
5秒长的.aiff文件适用于模拟器和设备。
最好知道模拟器和设备在传递给AudioServicesCreateSystemSoundID时检查文件的内容
答案 3 :(得分:0)
我尝试使用我的应用程序,播放声音很好。声音无法在模拟器中播放,当我尝试NSLog
网址时,我会得到与您相同的垃圾和EXC_BAD_ACCESS
顶部的垃圾。当我在设备上记录URL时,URL很好,但我得到EXC_BAD_ACCESS
。当我放下日志记录,声音播放,一切正常。如果有人能解释这种行为,我将不胜感激。至于你的问题,我会删除日志并尝试设备上的代码。
答案 4 :(得分:0)
使用“AVAudioPlayer”类播放.caf文件