iOS 播放音频的几种方法

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 本身不支持循环播放的问题。


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 对象。

只要将 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 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 类似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其他平台下相同。

本篇主要讲AVAudioPlayer,

AVAudioPlayer类封装了播放单个声音的能力。播放器可以用NSURL或者NSData来初始化,要注意的是NSURL不可以是网络url而必须是本地文件url,因为AVAudioPlayer不具备播放网络音频的能力。

一个AVAudioPlayer只能播放一个音频,如果你想混音你可以创建多个AVAudioPlayer实例,每个相当于混音板上的一个轨道。

一、创建一个播放器

 

AVAudioPlayer *player = [[AVAudioPlayerallocinitWithContentsOfURL:[NSURLfileURLWithPath:[[NSBundlemainBundlepathForResource:@"星月神话" ofType:@"mp3"]] error:nil];//使用本地URL创建


 

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:Data error:nil];//使用NSData创建

我之前讲过AVAudio不可以播放网络URL,但是可以播放NSData,我们似乎受到了启发,我们可以通过网络URL去创建NSData,然后再通过AVAudioPlayer来播放NSData,这样是不是就可以播放网络音乐了?但是此法并不可取,因为AVAudioPlayer只能播放一个完整的文件,并不支持流式播放,所以必须是缓冲完才能播放,所以如果网络文件过大抑或是网速不够岂不是要等很久?所以播放网络音频我们一般用音频队列。

二、播放器属性

创建一个AVAudioPlayer以后你就可以对它的各种属性进行访问或设置了。


1、音量

 

player.volume =0.8;//0.0-1.0之间


2、循环次数

 

player.numberOfLoops =3;//默认只播放一次


3、播放位置  

 

 player.currentTime =15.0;//可以指定从任意位置开始播放


4、声道数

 

  NSUInteger channels = player.numberOfChannels;//只读属性


5、持续时间

 

NSTimeInterval duration = player.duration;//获取持续时间


6、仪表计数

 

 

player.meteringEnabled =YES;//开启仪表计数功能

[playerupdateMeters];//更新仪表计数


三、播放声音

 

[player prepareToPlay];//分配播放所需的资源,并将其加入内部播放队列

[playerplay];//播放

[playerstop];//停止


四、代理方法


这个类对应的AVAudioPlayerDelegater的委托方法。 audioPlayerDidFinishPlaying:successfully: 当音频播放完成之后触发。当播放完成之后,可以将播放按钮的文本重新回设置成:Play Audio File


- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

{

    //播放结束时执行的动作

    [audioButton setTitle:@"Play Audio File" forState:UIControlStateNormal];

}


 

 

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;

{

    //解码错误执行的动作

}


 

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player;

{

    //处理中断的代码

}


audioPlayerEndInterruption:,当程序被应用外部打断之后,重新回到应用程序的时候触发。在这里当回到此应用程序的时候,继续播放音乐。

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player

{

    [audioPlayer play];

}

 AVAudioPlayer就介绍到这吧。


感谢博主,原文地址 http://blog.sina.com.cn/s/blog_a843a8850101k0d5.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PP浏览器1.04版本,全新操作界面,保持一贯的清爽风格,同时还全国首创添加了BT下载功能,让你的浏览更顺畅,赶快下载,感受一下超速度的浏览体验! PP浏览器覆盖了iOS移动操作系统,适用于iPhone/iPad/iTouch手机,是首款提供下载音视频功能,首创播放器离线观看,集下载与解压常用几十种压缩包直接预览,超级解压,使浏览器不仅仅是浏览器更成为下载资源管理必备工具。让你边看边听边下载,彻底摆脱电脑,尽享掌上IOS移动精彩!赶快来试试吧! 温馨提示:未越狱用户也可使用PP浏览器!!!! 特色功能介绍 1、浏览器首创“提供BT下载”功能,史无前例的完美结合! 用户打开浏览器,选择下载想要的种子文件,在下载管理中找到完成下载的种子文件,直接打开就能新建BT下载任务,轻轻松松的获得资源。再也不必为了某部电影而不得不安装网站的下载工具,也不用跳转其他下载工具,寻找资源,一切变得如此简单。 2、清新UI设计 视觉、体验全提升。 UI界面在沿袭其清新简洁风格的基础,改变了文件管理页面,增加了色彩明艳的资源分类图标,一目了然。同时,用户可以清楚的看到手机内存空间的相关信息,对资源下载有明确的判断,避免盲目下载,节省更多的流量和减少空间的占用。 3、超级解压、支持最全集下载与解压常用几十种压缩包直接预览,超级解压。 4、超强文档查看管理强大的文件管理,支持多种文档格式直接打开,TXT,PDF,DOC等复制、修改、样样全能。 5、WIFI传输畅快浏览开启WIFI传输功能,可通过电脑登录指定服务地址,直接浏览、下载、上传管理PP浏览器内文件。 6、资源分类明晰,下载资源分类明晰,以安装饭、图片、音乐、视频、其它来分类,下载资源时会自动为你分类,免去你再次找寻的困扰。让你轻轻松松下载在线资源。 7、快捷手势功能,可点击页面下方的图标进行切换。快速添加自定义站点,方便经常使用。导航页向您推荐丰富的分享下载资源,应用,视频,游戏,电子书,音乐,壁纸,娱乐应有尽有,一键搞定! PP浏览器1.04 beta更新日志 更新时间:2013-02-01 主要功能: 1.界面操作全面更新; 2.增加新功能,支持bt下载; 3.优化了音频、视频的播放体验; 4.修复其它部分BUG问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值