2

我正在尝试从 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 敲慬楴敶瑓楲杮upport/iPhone蒠ꁻĀ⾅獕牥⽳污湡䰯扩慲祲䄯灰楬楴汤大师灵溃玱椯桐汤⁥畭潴⽲獕牥䄯灰楬惯楴汤⽳㕅㡂㤱䌭䐳ⴸ䐴䙃㠭ⴷ䍁㈶㠵䙁㤴㈈䙁㤴㈯瑡䵥⹥灬慍捯牥䄯楬楬楴汤⽳㕅㡂䌭䐳ⴸ䐴䙃㠭ツⴷ䍁㈶㠵䙁㤴㈯瑡䵥⹥獬慍扯瑡䵥⹥灬1-C3D祡挮䰯慍潮/C3D挮殙4DCF-8C37-AC6258AF4902/LocateMe.app/play.caf

这要么是由于我对“描述”方法的误解,要么是导致问题的原因。

知道出了什么问题吗?

4

5 回答 5

3

NSLog 的第一个参数是格式字符串;您将[URL description]作为格式字符串传递给 NSLog 的第二次使用。这很糟糕,因为如果 URL 的描述包含任何%字符,那么它将最终打印堆栈中的随机内容。

相反,写

NSLog(@"%@", URL);

你甚至不需要在-description这里使用;NSLog 会自动为你调用它,因为它的%@意思是“一个对象”而不是“一个 NSString”,它足够聪明,可以为你做正确的事情。

于 2008-11-03T19:18:19.463 回答
3

此外,iPhone 模拟器似乎不喜欢播放 (systemSound) 长度超过 5 秒的声音。我遇到了与应用程序几乎总是播放启动系统声音相同的问题。

我在模拟器上工作的应用程序之一不会播放声音,但设备会。后来我发现模拟器和它处理声音的方式有一些奇怪的限制。我已经向 Apple 提交了一个错误。希望这将在 iPhone SDK 3.0 的发布中得到解决。

于 2009-05-01T00:06:04.857 回答
1

对此的更新。

我得到了允许我在设备上运行我的应用程序的密钥。

当应用程序在设备上运行时,我发现我的 .caf 文件成功播放。

然后我尝试了各种替代方案。

一个 60 秒长的 .wav 文件无法在模拟器和设备上运行。

5 秒长的 .wav 文件可以在模拟器上运行,但不能在设备上运行。

一个 5 秒长的 .aiff 文件可以在模拟器和设备上运行。

最好确切地知道模拟器和设备在将文件传递给 AudioServicesCreateSystemSoundID 时正在检查什么

于 2009-01-21T01:36:36.880 回答
0

我对播放声音的应用程序进行了同样的尝试。声音不会在模拟器中播放,当我尝试访问NSLogURL 时,我会得到与你相同的垃圾,并且EXC_BAD_ACCESS在它的顶部。当我在设备上记录 URL 时,URL 很好,但我EXC_BAD_ACCESS还是得到了。当我放弃日志记录时,声音播放并且一切正常。如果有人可以解释这种行为,我将不胜感激。至于您的问题,我会放弃日志记录并在设备上尝试代码。

于 2008-11-03T06:53:51.700 回答
0

使用“AVAudioPlayer”类播放 .caf 文件

于 2009-10-30T05:19:16.413 回答