`
xujinquan19
  • 浏览: 145509 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iPhone 应用开发:音频播放

阅读更多

 iPhone 应用开发:音频播放

 

 

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

iPhone OS 主要提供以下了几种播放音频的方法:

System Sound Services
AVAudioPlayer 类
Audio Queue Services
OpenAL

 

 

1. 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);
   
}

 

 

2. AVAudioPlayer 类

AVAudioPlayer 是 AVFoundation.framework 中定义的一个类,所以使用要先在工程中引入 AVFoundation.framework。我们可以把 AVAudioPlayer 看作是一个高级的播放器,它支持广泛的音频格式,主要是以下这些格式:

■ AAC
■ AMR(AdaptiveMulti-Rate, aformatforspeech)
■ ALAC(AppleLossless)
■ iLBC(internetLowBitrateCodec, anotherformatforspeech)
■ IMA4(IMA/ADPCM)
■ linearPCM(uncompressed)
■ µ-lawanda-law
■ MP3(MPEG-1audiolayer3

AVAudioPlayer 可以播放任意长度的音频文件、支持循环播放、可以同步播放多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,更高级的功能可以参考 AVAudioPlayer 的文档。要使用 AVAudioPlayer 的对象播放文件,你只需为其指定一个音频文件并设定一个实现了AVAudioPlayerDelegate 协议的 delegate 对象。这里举一个简单的例子,和上一个例子一样,实现一直循环播放的背景音乐:

view plaincopy to clipboardprint?
(void) playBackgroundSoundEffect {  
    NSString *soundFilePath =   
    [[NSBundle mainBundle] pathForResource: @"background"   
                                    ofType: @"wav"];   
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];   
    AVAudioPlayer *newPlayer =   
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL  
                                           error: nil];  
    [fileURL release];  
    self.player = newPlayer;   
    [newPlayer release];  
    [self.player prepareToPlay];  
      
    [self.player setDelegate: self];  
    self.player.numberOfLoops = -1;    // Loop playback until invoke stop method  
    [self.player play];  

(void) playBackgroundSoundEffect {
    NSString *soundFilePath =
    [[NSBundle mainBundle] pathForResource: @"background"
                                    ofType: @"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
    AVAudioPlayer *newPlayer =
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                           error: nil];
    [fileURL release];
    self.player = newPlayer;
    [newPlayer release];
    [self.player prepareToPlay];
   
    [self.player setDelegate: self];
    self.player.numberOfLoops = -1;    // Loop playback until invoke stop method
    [self.player play];
}

可以看到,只要将 AVAudioPlayer 的 numberOfLoops 属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。

AVAudioPlayer 同样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选 delegate 方法:

view plaincopy to clipboardprint?
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {   
    if (player == self.player && flag == YES) {   
        NSLog(@"Playback finish.");  
    }   

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
    if (player == self.player && flag == YES) {
        NSLog(@"Playback finish.");
    }
}

另外,你可以随时控制 AVAudioPlayer 对象的播放、暂停以及停止,通过判断对象的状态,分别调用play、pause 和 stop 方法即可:

view plaincopy to clipboardprint?
- (IBAction) playOrPause: (id) sender {   
    // if playing, pause   
    if (self.player.playing) {   
        [self.player pause];   
    // if stopped or paused, start playing   
    } else {   
        [self.player play];   
    } 
- (IBAction) playOrPause: (id) sender {
    // if playing, pause
    if (self.player.playing) {
        [self.player pause];
    // if stopped or paused, start playing
    } else {
        [self.player play];
    }


虽然 AVAudioPlayer 可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如 WAVE 文件,这样可以减少系统处理单元的资源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 连续播放 mp3 这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。

 

 

3. Audio Queue Services

如果以上两种音频播放的解决方案都无法满足你的需求,那么我想你肯定需要使用 Audio Queue Services。使用 Audio Queue Services 对音频进行播放,你可以完全实现对声音的控制。例如,你可以在声音数据从文件读到内存缓冲区后对声音进行一定处理再进行播放,从而实现对音频的快速/慢速播放的功能。

因为 Audio Queue Services 相对复杂很多,Apple 官方已经把它整理为一本书了,具体可以参考 Audio Queue Services Programming Guide 和 SpeakHere 的程序示例。

 

 

4. OpenAL

OpenAL 是一套跨平台的开源的音频处理接口,与图形处理的 OpenGL 类似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其他平台下相同。

iPhone 支持 OpenAL 1.1,我没有在实际开发中使用过,具体的文档可以参考 OpenAL 的网站http://openal.org 和 oalTouch 的程序示例。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/favormm/archive/2010/01/19/5212221.aspx#

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xujinquan19/archive/2010/12/07/6060814.aspx

分享到:
评论

相关推荐

    苹果官方iPhone应用高级开发课程(16集)

    资源名称:苹果官方iPhone应用高级开发课程(16集)资源...高效iPhone应用开发 2【】[iPhone应用开发高级课程]04.iPhone音频开发【】[iPhone应用开发高级课 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    iPhone应用开发从入门到精通代码

    iPhone应用开发从入门到精通作者:杨帆 郑青青 王凤筱 编著前 言入 门 篇第1章 iPhone OS介绍 21.1 iPhone OS预览21.1.1 iPhone OS的发展历史21.1.2 iPhone OS的外观31.1.3 多任务特性31.1.4 不支持的技术...

    Iphone睡眠软件音频

    Iphone睡眠软件音频:熟睡!是由专注在脑波研究与开发领域的LaluzAPP公司推出的重点脑波应用。只需睡前聆听“熟睡!”15分钟(软件默认播放时间),就能轻易获得5倍于平时的深度睡眠效果,安全有效。“熟睡!”经...

    iPhone应用程序开发指南.中文.pdf

    iPhone OS系统上的音频单元支持 145 iPhone音频的最佳实践 145 在iPhone OS使用视频 147 录制视频 147 播放视频文件 147 设备支持 150 确定硬件支持是否存在 150 和配件进行通讯 151 配件的基础 151 声明应用程序...

    苹果iPhone APP开发教程 iOS教程_极品

    5.创建第一款iPhone应用程序 6.操作和输出口 7.委托(Delegetas) 8.UI元素 9.加速度传感器(accelerometer) 14.SQLite数据库 15.发送电子邮件 16.音频和视频 17.文件处理 18.地图开发 19.应用内购买(App支付功能) 20...

    IPhone开发秘籍(第2版)

    用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...

    IPhone开发秘籍(第2版).part3.rar

    用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...

    IPhone开发秘籍(第2版).part2.rar

    用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...

    IPhone开发秘籍(第2版).part1.rar

    用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...

    iPhone开发秘籍.part2.rar

    本书面向新的iPhone 开发人员,他们马上要开发实际项目,但面对着一个全新的SDK。虽然每位程 序员创建表格的目标和经验并不相同,但大多数人都需要在其开发工作中解决类似的任务:如何构建表格, 如何创建安全的密钥...

    iPhone开发秘籍.part4.rar

    本书面向新的iPhone 开发人员,他们马上要开发实际项目,但面对着一个全新的SDK。虽然每位程 序员创建表格的目标和经验并不相同,但大多数人都需要在其开发工作中解决类似的任务:如何构建表格, 如何创建安全的密钥...

    iPhone开发秘籍.part1.rar

    本书面向新的iPhone 开发人员,他们马上要开发实际项目,但面对着一个全新的SDK。虽然每位程 序员创建表格的目标和经验并不相同,但大多数人都需要在其开发工作中解决类似的任务:如何构建表格, 如何创建安全的密钥...

    iPhone开发秘籍

    1.3 iphone应用程序组件 3 1.3.1 应用程序文件夹层次结构 3 1.3.2 可执行文件 3 1.3.3 info.plist文件 4 1.3.4 图标和默认图像 5 1.3.5 xib(nib)文件 5 1.3.6 应用程序束中不存在的文件 5 1.3.7 沙盒 6 ...

    Android应用开发揭秘(pdf )

    Android应用开发揭秘  Windows操作系统的诞生成就了微软的霸主地位,也造就了PC时代的繁荣。然而,以Android和iPhone手机为代表  的智能移动设备的发明却敲响了PC时代的丧钟!移动互联网时代(3G时代)已经来临,谁...

    MusicBox:Swift| iPhone 音频播放器应用程序

    MusicBox - 音乐播放器 为避免文案复杂化,只有一个(鸟)免费声音文件。 图标:树屋

    《iPhone开发实战》.(Christopher Allen).pdf

    在 web开发方面,分别介绍了三个 iphone web库,即 webkit、iui和 canvas,并讨论了 web开发环境 dashcode,最后阐述 web应用程序的调试。在 sdk开发方面,详细描述其各种组件和功能,包括 xcode、interface builder...

    《Android应用开发揭秘》源码.rar

     ·如何使用open core、mediaplayer、mediarecorder方便快速地开发出包含音频和视频等流媒体的丰富多媒体应用?  ·如何利用android 2.0中新增的蓝牙特性开发包含蓝牙功能的应用?又如何使用蓝牙api来完善应用的...

    IOS应用源码——录制音频 demo Recording.zip

    IOS应用源码——录制音频 demo Recording.zip

Global site tag (gtag.js) - Google Analytics