无延迟iOS播放声音

时间:2016-02-28 23:44:03

标签: ios objective-c audio core-audio

我无法找到如何以低延迟播放声音的方法。

我尝试使用AVFoundation音频播放器大约500毫秒的潜伏期

所以我尝试创建系统声音,并且在没有运气延迟的情况下大约200ms它对我来说并不多但对我没用。我最多需要50ms

确保我的声音样本清晰,没有沉默。

SystemSoundID cID;
BOOL spinitialized;

-(IBAction)doInit
{
    if (spinitialized){
        AudioServicesPlaySystemSound (cID);

        return;
    }



    NSURL *uref = [[NSURL alloc] initFileURLWithPath: [NSString stringWithFormat:@"%@/soundlib/1.wav", [[NSBundle mainBundle] resourcePath]]];

    OSStatus error = AudioServicesCreateSystemSoundID ((__bridge CFURLRef)uref, &cID);
    if (error) NSLog(@"SoundPlayer doInit Error is %d",(int)error);


    AudioServicesPlaySystemSound (cID);

    spinitialized = YES;
}

所以我按下按钮按下按钮。

4 个答案:

答案 0 :(得分:2)

使用已经加载到内存中的PCM波形数据的已经运行的RemoteIO音频单元(或AVAudioUnit)提供了在iOS设备上产生声音的最低延迟方法。

由于缓冲,零延迟是不可能的,但在所有当前的iOS设备上,缓冲区大小通常为5.3到5.8毫秒或更低。在最新的iOS设备上,您可以更频繁地获得音频回调。您的音频回调代码必须准备好手动将所需波形数据的正确顺序切片复制到音频缓冲区中。它将在非UI线程中调用,因此回调需要是线程安全的,并且不进行锁定,内存管理甚至是Objective C消息传递。

使用其他AV音频播放方法可能会导致延迟更高的延迟,因为将声音加载到内存所需的时间(包括潜在的拆包或解压缩)以及启动音频硬件(等等),以及通常使用更长的音频缓冲区即使启动RemoteIO音频单元也有自己的延迟;但它可以提前启动,可能会播放静音,直到您的应用需要在收到某些事件后以尽可能低(但非零)的延迟播放声音。

答案 1 :(得分:1)

使用AVAudioEngine

AVAudioUnitSampler是获得低延迟音频文件触发的一种非常简单的方法。

答案 2 :(得分:0)

我建议将The Amazing Audio Engine纳入您的项目http://theamazingaudioengine.com/

它有非常好的缓冲音频文件和播放的工具。正如hotpaw2所提到的那样,当你按下按钮时系统启动缓冲区会遇到问题。在按下按钮之前,您需要缓冲音频以减少延迟。

Michael在TAAE创建了这个类AEAudioFilePlayer http://theamazingaudioengine.com/doc/interface_a_e_audio_file_player.html

初始化AEAudioFilePlayer将为您加载缓冲区。然后,您可以要求播放器在按下按钮时播放音频。

答案 3 :(得分:0)

配置AVAudioSession的preferredIOBufferDuration属性。

preferredIOBufferDuration

The preferred I/O buffer duration, in seconds. (read-only)