试图通过iPhone模拟器播放声音

时间:2008-11-03 05:45:44

标签: iphone cocoa-touch ios-simulator

我正在尝试播放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

这可能是由于我对“描述”方法的误解,或者这导致了这个问题。

知道出了什么问题吗?

5 个答案:

答案 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文件