Play sound without latency iOS

2019-07-23 17:13发布

I can't find method how i can play sound real with low latency.

I try use AVFoundation audio player huge latency around 500ms

So i try create system sound, and too without luck latency around 200ms it's not much but not useful for me. I need 50ms max.

Be sure my sound sample is clear tone without silence.

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;
}

So i try call by button press down.

4条回答
虎瘦雄心在
2楼-- · 2019-07-23 17:31

Configure AVAudioSession's preferredIOBufferDuration property.

preferredIOBufferDuration

The preferred I/O buffer duration, in seconds. (read-only)
查看更多
对你真心纯属浪费
3楼-- · 2019-07-23 17:33

Using an already running RemoteIO Audio Unit (or AVAudioUnit) with PCM waveform data that is already loaded into memory provides the lowest latency method to produce sound on iOS devices.

Zero latency is impossible due to buffering, but on all current iOS devices, the buffer size is usually 5.3 to 5.8 milliseconds or lower. On the newest iOS devices you can get audio callbacks even more often. Your audio callback code has to ready to manually copy the proper sequential slice of the desired waveform data into an audio buffer. It will be called in a non-UI thread, so the callback needs to be thread safe, and do no locks, memory management or even Objective C messaging.

Using other AV audio playing methods may result in far higher latency due to the time it takes to load the sound into memory (including potential unpacking or decompression) and to power up the audio hardware (etc.), as well as typically using longer audio buffers. Even starting the RemoteIO Audio Unit has its own latency; but it can be started ahead of time, potentially playing silence, until your app needs to play a sound with the lowest possible (but non-zero) latency, upon receiving some event.

查看更多
时光不老,我们不散
4楼-- · 2019-07-23 17:37

I would suggest looking into incorporating The Amazing Audio Engine into your project http://theamazingaudioengine.com/

It has very nice tools for buffering audio files and playback. As hotpaw2 has mentioned, you're running into an issue with the system starting the buffer when you press the button. you will need to buffer the audio before the button is pressed to reduce your latency.

Michael at TAAE has create this class AEAudioFilePlayer http://theamazingaudioengine.com/doc/interface_a_e_audio_file_player.html

Initializing an AEAudioFilePlayer will load the buffer for you. You can then ask the Player to play the audio back when the button is pressed.

查看更多
SAY GOODBYE
5楼-- · 2019-07-23 17:38

AVAudioEngine with AVAudioUnitSampler is a really easy way to get low latency audio file triggering.

查看更多
登录 后发表回答