MyException - 我的异常网
当前位置:我的异常网» Iphone » 【引述】iPhone 应用开发:音频播放

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

www.myexceptions.net  网友分享于:2013-08-12  浏览:39次
【引用】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 的程序示例

文章评论

做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
代码女神横空出世
代码女神横空出世
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员必看的十大电影
程序员必看的十大电影
程序员的鄙视链
程序员的鄙视链
程序员和编码员之间的区别
程序员和编码员之间的区别
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Java程序员必看电影
Java程序员必看电影
 程序员的样子
程序员的样子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
一个程序员的时间管理
一个程序员的时间管理
老程序员的下场
老程序员的下场
漫画:程序员的工作
漫画:程序员的工作
每天工作4小时的程序员
每天工作4小时的程序员
编程语言是女人
编程语言是女人
如何成为一名黑客
如何成为一名黑客
中美印日四国程序员比较
中美印日四国程序员比较
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员都该阅读的书
程序员都该阅读的书
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
10个调试和排错的小建议
10个调试和排错的小建议
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我是如何打败拖延症的
我是如何打败拖延症的
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
总结2014中国互联网十大段子
总结2014中国互联网十大段子
旅行,写作,编程
旅行,写作,编程
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
那些争议最大的编程观点
那些争议最大的编程观点
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有