使用audio工具箱播放.wav
我正在尝试使用audio工具箱来播放.wav文件。 我有这个到目前为止:但是我的文件不会播放。 如果条件触发正确,但它不会播放。 但是,如果文件不存在,它将打印错误消息。 任何线索什么是错的?
-(void) playSound : (NSString *) fName : (NSString *) ext { SystemSoundID audioEffect; NSString *path = [[NSBundle mainBundle] pathForResource : fName ofType :ext]; if ([[NSFileManager defaultManager] fileExistsAtPath : path]) { NSURL *pathURL = [NSURL fileURLWithPath : path]; AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect); AudioServicesPlaySystemSound(audioEffect); } else { NSLog(@"error, file not found: %@", path); } AudioServicesDisposeSystemSoundID(audioEffect);; }
告诉它播放后,你不能立即处理声音ID,因为这会导致播放停止。 这就是为什么你没有听到它的原因。
你应该做的是在任何对象负责创build它(例如,一个视图控制器)持有一个属性中的ID的引用。 你可以在你的界面声明中声明:
@property(nonatomic, assign) SystemSoundID audioEffect;
…然后像这样分配给它:
AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &_audioEffect);
这不仅会让你在知道完成之后(例如,在viewDidUnload
)正确地处理它,而且还会阻止你每次想要播放时从磁盘读取文件它回来了,因为每个ID可以无限次播放。
最后一个提示:您可以直接请求一个包资源的URL,而不是请求一个string,然后将其转换为一个URL。
NSURL *audioURL = [[NSBundle mainBundle] URLForResource:fName withExtension:ext]; if([[NSFileManager defaultManager] fileExistsAtPath:[audioURL path]]) // ...
我从沃伦的评论中发现了这一点。 我不得不删除最后一行,因为它被设置为播放后的声音毫秒,因此不能被听到。
-(void) playSound : (NSString *) fName : (NSString *) ext { SystemSoundID audioEffect; NSString *path = [[NSBundle mainBundle] pathForResource : fName ofType :ext]; if ([[NSFileManager defaultManager] fileExistsAtPath : path]) { NSURL *pathURL = [NSURL fileURLWithPath : path]; AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect); AudioServicesPlaySystemSound(audioEffect); } else { NSLog(@"error, file not found: %@", path); } }