我正在尝试使用音频工具箱播放.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);;
}发布于 2013-01-08 08:46:12
您不能在通知播放之后立即处理声音ID,因为这会导致播放停止。这就是为什么你一开始没听到的原因。
相反,您应该在任何负责创建它的对象(例如,视图控制器)的属性中持有对ID的引用。你可以这样在你的接口声明中声明它:
@property(nonatomic, assign) SystemSoundID audioEffect;...and随后像这样分配给它:
AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &_audioEffect);这不仅允许您在以后知道已使用完它时正确地处理它(例如,在viewDidUnload中),而且还将防止您每次想要播放它时都必须从磁盘中读取它,因为每个ID可以播放无限次。
最后一条提示:您可以直接请求包资源的URL,而不是请求一个字符串,然后将其转换为URL。
NSURL *audioURL = [[NSBundle mainBundle] URLForResource:fName withExtension:ext];
if([[NSFileManager defaultManager] fileExistsAtPath:[audioURL path]])
// ...发布于 2013-01-08 03:49:52
我从Warrenm的评论中发现了这一点。我不得不删除最后一行,因为它在设置播放后几毫秒就杀死了声音,因此听不到。
-(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);
}
}https://stackoverflow.com/questions/14201141
复制相似问题