iPhone 应用开发:音频播放

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。没有音效的软件是残缺的,用户体验也会大打折扣,下面是自己对iPhone音频的一点总结。
iPhone 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 是最底层也是最简单的声音播放服务,调用 AudioServicesPlaySystemS ound 这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,因为它有很多限制:
  ■ 声音长度要小于 5 秒(一说小于30秒)
      ■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
  ■ 打包成 .caf, .aif, 或者 .wav 的文件
  ■ 不能控制播放的进度
  ■ 调用方法后立即播放声音
  ■ 没有循环播放和立体声控制
  另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例SysSound,但是官方的示例只有一些简单的用法,从文档中我们发现 可以通过 AudioServicesAddSystemSo undCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。以下代码可以实现一个在程序中循环播放的背景音乐:
     static void completionCallback (SystemSoundID  mySSID) {
            // 音频重放
           AudioServicesPlaySystemSound(mySSID);
    }
    - (void) playSound {
           // 获得 main bundle
           CFBundleRef mainBundle;
           SystemSoundID soundFileObject;
           mainBundle = CFBundleGetMainBundle ();
         // 获得声音文件的URL
         CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (
                                                            mainBundle,
                                                            CFSTR ("background"),
                                                            CFSTR ("wav"),
                                                            NULL
                                                            );
         // 创建 system sound 对象
         AudioServicesCreateSystemSoundID (
                                         soundFileURLRef,
                                         &soundFileObject
                                         );
         // 播放结束回调
         AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
                                              completionCallback,
                                              (void*) self);
         // 播放音频
         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 对象。这里举一个简单的例子,和上一个例子一样,实现一直循环播放的背景音乐:
     - (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;    // 循环播放音频,直到调用Stop方法
       [self.player play];
   }

可 以看到,只要将 AVAudioPlayer 的 numberOfLoops 属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。AVAudioPlayer 同样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选 delegate 方法:
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
      if (player == self.player && flag == YES) {
          NSLog(@"Playback finish.");
     }
}
另外,你可以随时控制 AVAudioPlayer 对象的播放、暂停以及停止,通过判断对象的状态,分别调用 play、pause 和 stop 方法即可:
 -(IBAction) playOrPause: (id) sender {
     // 音频控制逻辑
     if (self.player.playing) {
         [self.player pause];
     } 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 的程序示例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值