使用Audio Toolbox播放.wav

时间:2013-01-07 17:39:46

标签: iphone objective-c ios audio audiotoolbox

我正在尝试使用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);;
}

2 个答案:

答案 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]])
    // ...