8

当人们在我的应用程序中按下某些按钮时,我想播放一些简单的声音效果,我已经尝试了几件事,但我总是得到一个延迟,使声音看起来不同步。

我已经按照这里的教程进行操作,所以我尝试了音频服务中的构建,但它有延迟,我尝试了 AVAudioPlayer,但它也有延迟,即使我使用了“prepareToPlay”。

我真的必须安装一个像Finch这样的大而杂乱的库才能在我的简单应用程序中获得没有延迟的简单音效吗?

希望你能为我澄清事情!

更新

音频服务代码:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"PlopsX4"
                                      withExtension:@"aif"];
AudioServicesCreateSystemSoundID((CFURLRef)soundURL, &sound1);
AudioServicesPlaySystemSound(sound1);

viewDidLoad 中 AVAudioPlayer 的代码:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"PlopsX4"
                                      withExtension:@"aif"];
self.avSound = [[AVAudioPlayer alloc] 
       initWithContentsOfURL:soundURL error:nil];
[self.avSound prepareToPlay]

我要播放文件的方法中的 AVAudioPlayer 代码:

[self.avSound play];
4

3 回答 3

3

我得到这个工作的方式(我想我从另一篇关于 SO 的帖子中得到了这个想法)是创建一个空的 1 秒 .wav 文件并在初始化时“播放”它。之后,当我调用其他音效时,没有任何延迟。

我的声音播放器对象中有这样的东西

    SystemSoundID blID;
    SystemSoundID cID;

    +(void)doInit
    {
            if (spinitialized){
                    AudioServicesPlaySystemSound (blID);
                    return;
            }



            NSString *str = [[NSBundle mainBundle] pathForResource:@"ding.wav" ofType:@""];
            NSURL *uref = [NSURL fileURLWithPath:str];
            OSStatus error = AudioServicesCreateSystemSoundID ((CFURLRef)uref, &cID);
            if (error) NSLog(@"SoundPlayer doInit Error is %ld",error);

            str = [[NSBundle mainBundle] pathForResource:@"blank.wav" ofType:@""];
            uref = [NSURL fileURLWithPath:str];
            error = AudioServicesCreateSystemSoundID ((CFURLRef)uref, &blID);
            if (error) NSLog(@"SoundPlayer doInit Error is %ld",error);

            AudioServicesPlaySystemSound (blID);

            spinitialized = YES;
    }

然后我可以毫不拖延地使用以下方法播放“叮当”:

    AudioServicesPlaySystemSound (cid);
于 2013-01-04T18:53:58.887 回答
1

解决方案

我最终做了类似于上面迈克的事情。我最终在 viewDidLoad 中降低音量播放声音:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"PlopsX4"
                                              withExtension:@"aif"];
self.plops = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:nil];
[self.plops setVolume:0.0];
[self.plops play];

然后在我播放它的功能中,我这样做:

[self.plops setVolume:1.0];
[self.plops play];
于 2013-01-04T19:15:51.670 回答
0

我发现似乎有帮助的一件事是,在进入可能播放声音的屏幕时,播放声音的一小部分。这似乎“启动”了声音机制——分配内部对象、分页等。

(我观察到这类似于 Mike M 的方法。)

于 2013-01-04T19:02:15.807 回答