主要提供以下了几种播放音频的方法:

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(@"Playbackfinish." );

}

}

另外,你可以随时控制 AVAudioPlayer对象的播放、暂停以及停止,通过判断对象的状态,分别调用 play、pause 和 stop 方法即可:

- (IBAction) playOrPause:(id ) sender{

//if playing, pause

if  (self .player.playing){

[self .playerpause];

//if stopped or paused, startplaying

else  {

[self .playerplay];

}

虽然 AVAudioPlayer可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如 WAVE文件,这样可以减少系统处理单元的资源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 连续播放 mp3这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。

3. Audio Queue Services

如果以上两种音频播放的解决方案都无法满足你的需求,那么我想你肯定需要使用 Audio QueueServices。使用 Audio Queue Services对音频进行播放,你可以完全实现对声音的控制。例如,你可以在声音数据从文件读到内存缓冲区后对声音进行一定处理再进行播放,从而实现对音频的快速/慢速播放的功能。

因为 Audio Queue Services 相对复杂很多,Apple官方已经把它整理为一本书了,具体可以参考 Audio QueueServices ProgrammingGuide 和 SpeakHere 的程序示例。

4. OpenAL

OpenAL 是一套跨平台的开源的音频处理接口,与图形处理的 OpenGL类似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其他平台下相同。

本篇主要讲AVAudioPlayer

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

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

一、创建一个播放器(最好创建全局变量)

AVAudioPlayer *player =[[AVAudioPlayeralloc] initWithContentsOfURL:[NSURLfileURLWithPath:[[NSBundlemainBundle] pathForResource:@"星月神话" 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:@"PlayAudio File" forState:UIControlStateNormal];

}

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

{

//解码错误执行的动作

}

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

{

//处理中断的代码

}

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

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player

{

[audioPlayer play];

}

iOS开发之音频播放AVAudioPlayer 类的介绍相关推荐

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

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

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

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

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

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

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

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

  5. iOS录音和音频播放

    文章目录 简介 `AVAudioRecorder`录音 `AVAudioPlayer`播放音频文件. 简介 最近公司研发了一个语音识别的框架,但这个框架是后端识别,所以需要手机端录音,录音后将音频文件 ...

  6. iOS开发:音乐播放器

    /******************       iOS开发:音乐播放器     *****************/ 要求:给button一个触发事件,点击一下播放歌曲,显示暂停提示: 再点击一下 ...

  7. moviepy音视频开发:音频剪辑基类AudioClip

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识介绍 1.1.声音三要素: 音调:人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高. 音量:也就是响度 ...

  8. android开发监听媒体播放器,Android开发之媒体播放工具类完整示例

    本文实例讲述了Android开发之媒体播放工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.media.Media ...

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

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

最新文章

  1. db2case语句_DB2 常用的SQL语句
  2. How to never give up
  3. 深入理解javascript之this
  4. Matlab生成各种伪随机信号_idinput指令
  5. sql server 服务器之间传递消息,SQL Server 2008 Service Broker教程 - 无法接收消息(transmission_status中的异常)...
  6. 顶级程序员的生活是怎样的? 网友: 很后悔, 找不到女朋友!
  7. SAP 电商云 Spartacus UI 产品明细页面路由路径的自定义配置
  8. 在 JavaScript 中将 String 与 XML 相互转换
  9. python编程 从入门到实践-终于懂了python编程从入门到实践
  10. 为什么小角度的弧度值可以近似等于正切值或者正弦值?
  11. java调用js tel,jQuery国际电话区号选择插件intlTelInput.js
  12. 带云的计算机词语,关于写带有云字的词语
  13. 黑莓手机刷Linux系统
  14. 赖世雄老师---不完全及物动词
  15. 性能测试指南 | 一些实用的排查命令(未完待续)
  16. 2022年,送给程序员的运动健身知识
  17. java后端扇形图实现
  18. 如何处理训练样本不均衡的问题
  19. 在linux服务器上如何下载ftp上面的文件?lftp详解
  20. 无聊的生活,无聊的世界

热门文章

  1. HTML之CSS画三角形原理,使用css画三角形的方法代码
  2. L2-027 名人堂与代金卷(含测试点2/3分析)
  3. React项目部署踩坑
  4. [项目管理-8]:软硬件项目管理 - 项目成本管理(钱、财)
  5. 人脸识别算法垃圾分类是如何应用的
  6. 公众平台返回原始数据为: 错误代码-40164,错误信息-invalid ip, not in whitelist hint...
  7. git本地切换远程分支
  8. 读了这个小说,比较欣赏这个观点
  9. web前端基础 html5+css3(九.精灵图,字体图标,css三角,鼠标样式cursor,.轮廓线 outline,vertical-align,文本溢出显示省略号)
  10. JSON格式以及JSON校验工具