首页 > 代码库 > iOS平台音频开发

iOS平台音频开发

    在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming Guide》(需要有 Apple ID 才能打开链接),加了一些实际使用的经验。

    iPhone OS 主要提供System Sound Services播放音频

    System Sound Services 是最底层也是最简单的声音播放服务,调用AudioServicesPlaySystemSound这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,因为它有很多限制:

■ 声音长度要小于 30 秒

■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的

■ 打包成 .caf, .aif, 或者 .wav 的文件

■ 不能控制播放的进度

■ 调用方法后立即播放声音

■ 没有循环播放和立体声控制 

    另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例 SysSound,但是官方的示例只有一些简单的用法,从文档中我们发现可以通过AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。以下代码可以实现一个在程序中循环播放的背景音乐:

view plaincopy to clipboardprint?

static void completionCallback (SystemSoundID  mySSID) {   

    // Play again after sound play completion   

    AudioServicesPlaySystemSound(mySSID);   

}   

- (void) playSound {   

    // Get the main bundle for the app   

    CFBundleRef mainBundle;   

    SystemSoundID soundFileObject;   

    mainBundle = CFBundleGetMainBundle ();   

       

    // Get the URL to the sound file to play   

    CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (   

                                                         mainBundle,   

                                                         CFSTR ("background"),   

                                                         CFSTR ("wav"),   

                                                         NULL   

                                                         );   

    // Create a system sound object representing the sound file   

    AudioServicesCreateSystemSoundID (   

                                      soundFileURLRef,   

                                      &soundFileObject   

                                      );   

    // Add sound completion callback   

    AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,   

                                           completionCallback,   

                                           (void*) self);   

    // Play the audio   

    AudioServicesPlaySystemSound(soundFileObject);   

       

}  

static void completionCallback (SystemSoundID  mySSID) {

    // Play again after sound play completion

    AudioServicesPlaySystemSound(mySSID);

}

- (void) playSound {

    // Get the main bundle for the app

    CFBundleRef mainBundle;

    SystemSoundID soundFileObject;

    mainBundle = CFBundleGetMainBundle ();

    

    // Get the URL to the sound file to play

    CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (

                                                         mainBundle,

                                                         CFSTR ("background"),

                                                         CFSTR ("wav"),

                                                         NULL

                                                         );

    // Create a system sound object representing the sound file

    AudioServicesCreateSystemSoundID (

                                      soundFileURLRef,

                                      &soundFileObject

                                      );

    // Add sound completion callback

    AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,

                                           completionCallback,

                                           (void*) self);

    // Play the audio

    AudioServicesPlaySystemSound(soundFileObject);

    

}


iOS平台音频开发