在 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 是最底层也是最简单的声音播放服务,调用 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 bundle7.        CFBundleRef mainBundle;8.        SystemSoundID soundFileObject;9.        mainBundle = CFBundleGetMainBundle ();10.       // 获得声音文件的URL11.       CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (12.                                                          mainBundle,13.                                                          CFSTR ("background"),14.                                                          CFSTR ("wav"),15.                                                          NULL16.                                                          );17.       // 创建 system sound 对象18.       AudioServicesCreateSystemSoundID (19.                                       soundFileURLRef,20.                                       &soundFileObject21.                                       );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: fileURL8.                                            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 方法:
?
- (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 的程序示例。

转载于:https://blog.51cto.com/rongbaohong/793708

iPhone 应用开发:音频播放相关推荐

  1. iOS开发--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  2. iphone开发之音频播放类AVAudioPlayer的使用——加纯代码案例

    1.本节目标 (1)使用AVAudioPlayer类播放音频 (2)掌握后台播放音乐 (3)自定义后台任务 (5)使用MPMoviePlayer 2.IOS音频播放概述 (1)IOS系统中的音频播放方 ...

  3. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  4. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  5. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  6. 视频直播APP源码开发iOS音频播放流程

    视频直播APP源码开发iOS音频播放流程 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的, ...

  7. 流媒体开发(一)音频播放

    序言 随着人们学习.娱乐和工作的需要,人们对如何在网络上传输海量的视频.音频等多媒体信息有了进一步的要求.在这种背景下,iOS流媒体技术应运而生.通俗的讲,所谓的iOS流媒体技术,就是将视音频文件经过 ...

  8. iOS开发系列–音频播放、录音、视频播放、拍照、视频录制

    iOS开发系列–音频播放.录音.视频播放.拍照.视频录制 - KenshinCui - 博客园 代码改变世界 Posts - 69, Articles - 0, Comments - 1004 Cnb ...

  9. 鸿蒙音频低延迟,鸿蒙OS 音频播放开发指导

    场景介绍 音频播放的主要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放任务进行管理. 接口说明 接口名 描述 AudioRenderer(AudioRendererInf ...

最新文章

  1. Unable to find the ncurses libraries or the required header files解决
  2. UA MATH571A QE练习 R语言 多重共线性与岭回归
  3. 通过Playbook部署LAMP(5)
  4. SAP云平台上部署应用时遇到disk quota不够的问题
  5. 解决Latex正文中的参考文献有许多[0]的情况
  6. 零基础带你学习MySQL—加密函数和系统函数(十六)
  7. noip 2010 数字统计
  8. C/C++[codeup 2069]中位数
  9. lvcreate 创建逻辑卷
  10. 用命令提示符使用MySQL
  11. 8700k超频测试软件,双节+双核,i7 8700k +Z370 Extreme4超频测试
  12. PPT如何制作一级标题、二级标题
  13. python买卖股票_python买卖股票的最佳时机(基于贪心_蛮力算法)
  14. 高鹏清华计算机系,中国最顶尖的学霸到底有多厉害?看完,膝盖已跪碎!
  15. 票据背书以及票据背书的好处
  16. 用计算机做科学实验心得体会,做实验的心得体会3篇
  17. java西语_使用Java 8 DateTimeFormatter和西班牙语月份名称进行解析
  18. 谷胱甘肽(GSH)修饰的CdTe/CdS量子点(GSH-CdTe/CdSQDs)|PEG修饰水溶性量子点ZnS:Mn
  19. 爱奇艺知识播放体验优化的探索和实践
  20. 香港特区银行怎么开帐户?

热门文章

  1. 型人格 disc测试_什么是压抑型人格,如何测试筛查压抑型人格?
  2. 22条 API 设计规范,API 一致性设计
  3. Swift3的playground中对UI直接测试支持的改变
  4. ios button.imageview 和setimage的区别
  5. apache2.4.9 开启path_info访问_浅淡flask在win下用Apache24及mod_wsgi部署的那些坑
  6. java 无视报错编译_java 无视报错编译
  7. 网络服务-DNS 域名系统服务
  8. 为什么在notebook里面还是显示torch_torch.utils.cpp_extension对c++/cuda进行拓展
  9. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
  10. matlab中表示拉普拉斯分布_CHAPT1:场论;电磁学和微波学的基本的数学手段和表示...