我正在尝试使用Audio Toolbox播放.wav文件。到目前为止我有这个: 但是我的文件不会播放。 If条件被触发,但它不会播放。 如果文件不存在,它将打印错误消息。有什么问题的线索?
-(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);;
}
答案 0 :(得分:1)
我从沃伦的评论中得出结论。我不得不删除最后一行,因为它在设置播放后杀死了声音毫秒,因此无法听到。
-(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);
}
}
答案 1 :(得分:1)
在告诉它播放后,您不能立即处理声音ID,因为这会导致播放停止。这就是为什么你没有听到它的原因。
您应该做的是在属性中对任何负责创建它的对象(例如,视图控制器)保持对ID的引用。你在接口声明中声明它是这样的:
@property(nonatomic, assign) SystemSoundID audioEffect;
...然后像这样分配给它:
AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &_audioEffect);
这样,您不仅可以在以后知道自己已完成处理时(例如在viewDidUnload
中)正确处理它,还可以防止您必须从中读取文件。每次要播放时都会播放磁盘,因为每个ID都可以无限次播放。
最后一个提示:您可以直接请求捆绑资源的URL,而不是请求字符串,然后将其转换为URL。
NSURL *audioURL = [[NSBundle mainBundle] URLForResource:fName withExtension:ext];
if([[NSFileManager defaultManager] fileExistsAtPath:[audioURL path]])
// ...