无延迟播放声音 iOS

Posted

技术标签:

【中文标题】无延迟播放声音 iOS【英文标题】:Play sound without latency iOS 【发布时间】:2016-02-28 23:44:02 【问题描述】:

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

我尝试使用 AVFoundation 音频播放器 500 毫秒左右的巨大延迟

所以我尝试创建系统声音,但也没有 200 毫秒左右的运气延迟,这对我来说并不多但没用。我需要最多 50 毫秒。

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

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;

所以我尝试按下按钮进行呼叫。

【问题讨论】:

您尝试过 AVAudioEngine 吗?我没有尝试过延迟,但如果你观看 WWDC 视频,低延迟是他们的一大主张。 — 另外,不要忘记您的应用程序产生的 first 声音总是 可能会受到延迟的影响。因此,您应该考虑在启动后立即播放“静音”声音,以刺激音频服务器。 我通常更喜欢在我的应用程序中使用 AVFoundation,但我的优势是我总共有 10 - 20 个小尺寸的声音,并且在我的应用程序启动时,我调用 prepareToPlay 方法每个声音。如果您的应用中的声音数量有限,它可能会对您有所帮助。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

我在这里推荐了一些使用 AVAudioEngine 的代码:***.com/questions/34680007/…【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

配置 AVAudioSession 的 preferredIOBufferDuration 属性。

preferredIOBufferDuration

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

【讨论】:

不幸的是,根据我的经验,设置此值绝对不会影响缓冲区大小/持续时间,事实上,即使将其设置为非常低的值,也会增加整体延迟。 我的经历也一样

以上是关于无延迟播放声音 iOS的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS (Novocaine) 上播放和停止声音样本

如何以绝对最小或*量化*延迟播放声音?

JQuery 不播放多个声音文件或延迟事件

Android声音播放延迟到while循环结束

使用 AVAudioPlayer 延迟播放声音

如何延迟 For 循环直到声音在 Swift 中播放完毕