`
linwwwei
  • 浏览: 222840 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【引用】iPhone 应用开发:音频播放

阅读更多

Phone OS 音频分类:
 

 (1)High level, easy to use
     ?System Sound API - short sounds
     ?AVAudioPlayer class - ObjC, simple API
    (2)Lower level, takes more effort but much more control
     ?Audio Toolbox - recording and playback, streaming, full control
     ?Audio Units - processing audio
     ?OpenAL
Sound effects音响效果:
   ?Button Clicks
    ?Alert Sounds
    ?Short Sounds Accompanying User Actions
iPhone OS 主要提供以下了几种播放音频的方法:
   ?System Sound Services
     ?AVAudioPlayer 类
   ?Audio Queue Services
     ?OpenAL
    1. System Sound Services
        System Sound Services 是最底层也是最简单的声音播放服务,调用 AudioServicesPlaySystemSound 这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,因为它有很多限制:
    ■ 声音长度要小于 5 秒(一说小于30秒)
      ■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
    ■ 打包成 .caf, .aif, 或者 .wav 的文件
    ■ 不能控制播放的进度
    ■ 调用方法后立即播放声音
    ■ 没有循环播放和立体声控制
    另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例SysSound,但是官方的示例只有一些简单的用法,从文档中我们发现可以通过 AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。以下代码可以实现一个在程序中循环播放的背景音乐:
  1. static void completionCallback (SystemSoundID  mySSID) {
  2.     // 音频重放
  3.     AudioServicesPlaySystemSound(mySSID);
  4. }
  5. - (void) playSound {
  6.     // 获得 main bundle
  7.     CFBundleRef mainBundle;
  8.     SystemSoundID soundFileObject;
  9.     mainBundle = CFBundleGetMainBundle ();
  10.     // 获得声音文件的URL
  11.     CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (
  12.                                                          mainBundle,
  13.                                                          CFSTR ("background"),
  14.                                                          CFSTR ("wav"),
  15.                                                          NULL
  16.                                                          );
  17.     // 创建 system sound 对象
  18.     AudioServicesCreateSystemSoundID (
  19.                                       soundFileURLRef,
  20.                                       &soundFileObject
  21.                                       );
  22.     // 播放结束回调
  23.     AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
  24.                                            completionCallback,
  25.                                            (void*) self);
  26.     // 播放音频
  27.     AudioServicesPlaySystemSound(soundFileObject);
  28.    
  29. }
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 对象。这里举一个简单的例子,和上一个例子一样,实现一直循环播放的背景音乐:
  1. - (void) playBackgroundSoundEffect {
  2.     NSString *soundFilePath =
  3.     [[NSBundle mainBundle] pathForResource: @"background"
  4.                                     ofType: @"wav"];
  5.     NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
  6.     AVAudioPlayer *newPlayer =
  7.     [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
  8.                                            error: nil];
  9.     [fileURL release];
  10.     self.player = newPlayer;
  11.     [newPlayer release];
  12.     [self.player prepareToPlay];
  13.     [self.player setDelegate: self];
  14.     self.player.numberOfLoops = -1;    // 循环播放音频,直到调用Stop方法
  15.     [self.player play];
  16. }
可 以看到,只要将 AVAudioPlayer 的 numberOfLoops 属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。AVAudioPlayer 同样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选 delegate 方法:
  1. - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
  2.     if (player == self.player && flag == YES) {
  3.         NSLog(@"Playback finish.");
  4.     }
  5. }
另外,你可以随时控制 AVAudioPlayer 对象的播放、暂停以及停止,通过判断对象的状态,分别调用 play、pause 和 stop 方法即可:

  1. -(IBAction) playOrPause: (id) sender {
  2.     // 音频控制逻辑
  3.     if (self.player.playing) {
  4.         [self.player pause];
  5.     } else {
  6.         [self.player play];
  7.     }
虽 然 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 的程序示例

分享到:
评论

相关推荐

    iPhone游戏开发入门经典:也适用于iPad源码

    AVFoundation框架提供了音频播放和处理的功能,开发者需要了解如何导入、播放和控制游戏中的音效。 在iOS应用的生命周期管理和内存管理方面,本书也会进行讲解。例如,如何在用户离开游戏时正确保存进度,以及如何...

    iPhone应用开发从入门到精通

    ### iPhone应用开发从入门到精通 #### 一、基础知识篇 **1.1 iOS系统概述** iOS是由苹果公司开发的移动操作系统,专为iPhone、iPad和iPod touch等设备设计。自2007年发布以来,iOS已经成为全球最受欢迎的移动操作...

    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游戏开发实践指南》是一本面向初学者和中级开发者的技术书籍,旨在通过实例和详细的指导,帮助读者掌握iOS平台上游戏开发的核心技能。配套源代码是本书教学内容的重要组成部分,它包含了书中各个章节实例的...

    iPhone SDK 3 Programming: Advanced Mobile Development for Apple iPhone and iPod touch

    Maher Ali博士,资深移动开发者和贝尔实验室科学家,拥有丰富的移动应用开发经验。作为本书的作者,他不仅具备深厚的理论基础,还具有实践经验,能够为读者提供详尽的技术指导。 #### 三、主要内容 本书的核心内容是...

    iPhone开发实战.pdf

    《iPhone开发实战》这本书是为想要踏入iOS应用开发领域的初学者和有志于提升技能的开发者精心准备的一份宝贵资源。iOS开发,尤其是针对iPhone的应用程序设计,是苹果生态系统中的重要组成部分,它涉及到Apple的iOS...

    iPhone开发进阶.pdf

    在实际的应用开发中,开发者通常使用Xcode作为开发环境。Xcode提供了一个集成开发环境(IDE),包括代码编辑器、调试器和性能分析工具。它还集成了Interface Builder,这是一个图形化的用户界面构建工具,可以方便地...

    iPhone与iPad开发实战(iPhone and iPad in Action )

    - **音频处理**:学习如何播放和录制音频文件,以及如何使用AVFoundation框架进行音频处理。 - **视频处理**:了解如何播放和编辑视频内容。 - **图形绘制**:使用Core Graphics库进行复杂的图形绘制操作。 - **图像...

    iPhone开发秘籍(The iphone developer cookbook)(第2版)(英文版)

    本书不仅涵盖了基础的iPhone开发知识,还深入探讨了诸多高级技巧和特殊效果,是学习和提升iPhone应用开发技能的宝贵资源。 ### 重要知识点概览 #### 1. 全面的技术覆盖 本书通过丰富的代码示例和清晰的解释,全面...

    自己手机的Iphone IOS系统开发源码

    很抱歉,但根据提供的信息,标题、描述和标签均指向"自己手机的Iphone IOS系统开发源码",而压缩包子文件的文件名称列表却显示的是Android应用开发的相关文件,而不是iOS系统的源码。Android应用的主要组成部分包括...

    iPhone开发基础 cocoa入门

    Cocoa是Apple为Mac OS X和iOS平台提供的一套强大的应用开发框架。对于iPhone开发来说,掌握Cocoa是必不可少的基础之一。本章节将从Cocoa的定义出发,深入探讨其在iPhone开发中的地位与作用。 - **Cocoa定义**:...

    iPhone开发001-概述(Gary)

    不仅可以用于开发iPhone应用,还可以用于开发Mac OS的应用程序。 2. **Interface Builder**:是Xcode的一部分,主要用于构建用户界面(UI)。通过拖放控件并配置属性,开发者可以轻松地创建出美观且功能丰富的用户界面...

    iphone 开发整理

    在iOS平台上进行应用程序...通过掌握以上知识点,开发者可以高效地进行iPhone应用的开发,无论是简单的UI应用还是复杂的3D游戏,都能游刃有余。在实践中不断学习和探索,可以提升开发技能,适应不断变化的iOS生态系统。

Global site tag (gtag.js) - Google Analytics