1

我正在尝试使用音频工具箱播放 .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);;
}
4

2 回答 2

1

我从 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);
        }
    }
于 2013-01-07T19:49:51.597 回答
1

您不能在告诉它播放后立即处理声音 ID,因为这会导致播放停止。这就是为什么你一开始没有听到它的原因。

相反,您应该做的是在负责创建它的任何对象(例如,视图控制器)的属性中保存对 ID 的引用。你会在你的接口声明中这样声明它:

@property(nonatomic, assign) SystemSoundID audioEffect;

...然后像这样分配给它:

AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &_audioEffect);

这不仅可以让你在以后知道你已经完成它的时候正确处理它(例如 in viewDidUnload),而且还可以防止你每次想要播放它时都必须从磁盘中读取文件返回,因为每个 ID 都可以无限次播放。

最后一个提示:您可以直接请求捆绑资源的 URL,而不是请求字符串然后将其转换为 URL。

NSURL *audioURL = [[NSBundle mainBundle] URLForResource:fName withExtension:ext];
if([[NSFileManager defaultManager] fileExistsAtPath:[audioURL path]])
    // ...
于 2013-01-08T00:46:12.013 回答