OC-系统音效播放

 

一.介绍

AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service).System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制:

音频播放时间不能超过30s
数据必须是PCM或者IMA4格式
音频文件必须打包成.caf、.aif、.wav中的一种(注意这是官方文档的说法,实际测试发现一些.mp3也可以播放)

 

音效处理对应的框架是AudioToolbox,只不过AVFoundation框架包含了此框架


二.使用

使用System Sound Service 播放音效的步骤如下:


 方法播放音效(后者带有震动效果)

2.使用对应的API,开始播放音效:

  (1)根据音效文件,来生成SystemSoundID

    

  (2)根据SystemSoundID,播放音效

    调用AudioServicesCreateSystemSoundID(CFURLRef  inFileURL, SystemSoundID*  outSystemSoundID)函数获得系统声音ID

    如果需要监听播放完成操作,

    则使用AudioServicesAddSystemSoundCompletion(SystemSoundID inSystemSoundID, CFRunLoopRef  inRunLoop, CFStringRef  inRunLoopMode

    或者使用 AudioServicesSystemSoundCompletionProc  inCompletionRoutine, void*  inClientData)方法注册回调函数。

    如果不需要监听播放完成的操作,

    则调用AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID) 

    或者AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)

  (3)根据SoundID释放内存

    AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID),(如果是不需要监听播放完成的方法,则不需要这句代码)

   

代码如下:

//获取路径
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"2018-11-27 10_36_51 1.wav" withExtension:nil];
    
    //根据音效文件创建systemSoundId
    SystemSoundID soundID = 0;
    AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
    
    
    //根据soundId播放音效一:
//    AudioServicesPlaySystemSoundWithCompletion(soundID, ^{
//        NSLog(@"play finish");
//        //当音效播放完成时,我们需要根据SystemSoundID 释放内存资源
//        AudioServicesDisposeSystemSoundID(soundID);
//    });
    
    
    
//    根据soundId播放音效二:播放音效时,手机会跟着震动;
    AudioServicesPlayAlertSoundWithCompletion(soundID, ^{
        NSLog(@"play finish");
        AudioServicesDisposeSystemSoundID(soundID);
    });

 

posted @ 2019-10-31 14:04  一人前行  阅读(816)  评论(0编辑  收藏  举报