- 浏览: 145509 次
- 性别:
- 来自: 广州
最新评论
-
yinren13:
说的便捷的视频会议,我们公司的遥控器一按就能开始的视频会议tu ...
便捷视频会议 -
xujinquan19:
...
可视通讯与移植、跨平台开发 -
xujinquan19:
...
Android 平台下的即时通讯 -
xujinquan19:
...
Android 平台下的即时通讯 -
xujinquan19:
...
Android 平台下的即时通讯
iPhone 应用开发:音频播放
在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming Guide》(需要有 Apple ID 才能打开链接),加了一些实际使用的经验。
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 本身不支持循环播放的问题。以下代码可以实现一个在程序中循环播放的背景音乐:
view plaincopy to clipboardprint?
static void completionCallback (SystemSoundID mySSID) {
// Play again after sound play completion
AudioServicesPlaySystemSound(mySSID);
}
- (void) playSound {
// Get the main bundle for the app
CFBundleRef mainBundle;
SystemSoundID soundFileObject;
mainBundle = CFBundleGetMainBundle ();
// Get the URL to the sound file to play
CFURLRef soundFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("background"),
CFSTR ("wav"),
NULL
);
// Create a system sound object representing the sound file
AudioServicesCreateSystemSoundID (
soundFileURLRef,
&soundFileObject
);
// Add sound completion callback
AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
completionCallback,
(void*) self);
// Play the audio
AudioServicesPlaySystemSound(soundFileObject);
}
static void completionCallback (SystemSoundID mySSID) {
// Play again after sound play completion
AudioServicesPlaySystemSound(mySSID);
}
- (void) playSound {
// Get the main bundle for the app
CFBundleRef mainBundle;
SystemSoundID soundFileObject;
mainBundle = CFBundleGetMainBundle ();
// Get the URL to the sound file to play
CFURLRef soundFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("background"),
CFSTR ("wav"),
NULL
);
// Create a system sound object representing the sound file
AudioServicesCreateSystemSoundID (
soundFileURLRef,
&soundFileObject
);
// Add sound completion callback
AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
completionCallback,
(void*) self);
// Play the audio
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 对象。这里举一个简单的例子,和上一个例子一样,实现一直循环播放的背景音乐:
view plaincopy to clipboardprint?
(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; // Loop playback until invoke stop method
[self.player play];
}
(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; // Loop playback until invoke stop method
[self.player play];
}
可以看到,只要将 AVAudioPlayer 的 numberOfLoops 属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。
AVAudioPlayer 同样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选 delegate 方法:
view plaincopy to clipboardprint?
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
if (player == self.player && flag == YES) {
NSLog(@"Playback finish.");
}
}
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
if (player == self.player && flag == YES) {
NSLog(@"Playback finish.");
}
}
另外,你可以随时控制 AVAudioPlayer 对象的播放、暂停以及停止,通过判断对象的状态,分别调用play、pause 和 stop 方法即可:
view plaincopy to clipboardprint?
- (IBAction) playOrPause: (id) sender {
// if playing, pause
if (self.player.playing) {
[self.player pause];
// if stopped or paused, start playing
} else {
[self.player play];
}
- (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 类似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其他平台下相同。
iPhone 支持 OpenAL 1.1,我没有在实际开发中使用过,具体的文档可以参考 OpenAL 的网站http://openal.org 和 oalTouch 的程序示例。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/favormm/archive/2010/01/19/5212221.aspx#
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xujinquan19/archive/2010/12/07/6060814.aspx
发表评论
-
手机视频会议
2012-11-16 14:03 813在这个时代,手机被开发者们所赋予的意义已经远远超出了大众的期望 ... -
视频通讯demo源码
2012-11-09 15:23 1103以下为anychat视频通讯系统中的部分回调函数源码: 具体 ... -
音视频对话开发
2012-09-20 17:21 713AnyChat for Android是佰锐科技继2010年发 ... -
H.264视频编码标准在网络视频监控系统中的应用 .
2012-08-24 15:13 912【摘 要】本文介绍了ITU-T最新高性能视频压缩标准H.264 ... -
安卓平台下的即时通讯
2012-08-24 15:12 940基于Android 平台简易即时通讯的研究与设计 摘要 ... -
iOS音视频封装与传输demo
2012-08-24 15:01 1947ios没有直接得api用来封装传输rtp,但是经常有用到得接收 ... -
手机音视频应用开发(专注于Symbian、iPhone、Android等跨平台音视频应用开发方案)
2012-08-24 14:47 1115一款好的手机应用, 能让用户在第一分钟就爱上他, 一款烂的手 ... -
手机视频通讯开发
2012-08-24 14:46 787如今,3G网络快速发展 ... -
android视频开发
2012-08-16 17:31 986摘要:论文简单介绍Android 平台的特性,主要阐述了基于A ... -
android视频聊天软件推荐
2012-08-15 17:00 1028正在当前那个社会 ... -
音视频交流服务系统
2012-03-15 16:22 877下面的这个平台是一种视频服务的应用,比如A(客户端)打视频电话 ... -
音视频开发平台
2012-03-15 16:12 806近日,腾讯公司发布了Q ... -
即时通讯开发平台(音视频)
2012-03-15 16:11 900近日,腾讯公司发布了Q ... -
手机视频之营销模式
2012-02-16 10:43 8713G时代的逼近,手机视 ... -
手机视频应用开发
2011-12-30 14:56 751AnyChat for Android是佰锐科技继2010年发 ... -
Android视频通话(即时通讯,可视电话,视频通讯,监控,电视直播)推荐
2011-06-22 15:21 2008正在当前那个社会里,相信良多伴侣都是独自一人正在中地拼搏,好久 ... -
安卓视频通讯与监控系统完全版本正式发布
2011-05-04 17:12 1082通过数个月的研发,视频通讯安卓版本的程序已经出来了。 ... -
LINUX常用命令
2011-04-22 15:22 632Linux 系统常用命令格 ... -
Linux网络编程
2011-04-22 15:17 661Linux网络编程 linux socket的 ... -
GCC对ARM支持的所有优化选项及指令
2011-04-22 15:11 19713.17.1 ARM Options These `-m' ...
相关推荐
资源名称:苹果官方iPhone应用高级开发课程(16集)资源...高效iPhone应用开发 2【】[iPhone应用开发高级课程]04.iPhone音频开发【】[iPhone应用开发高级课 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
iPhone应用开发从入门到精通作者:杨帆 郑青青 王凤筱 编著前 言入 门 篇第1章 iPhone OS介绍 21.1 iPhone OS预览21.1.1 iPhone OS的发展历史21.1.2 iPhone OS的外观31.1.3 多任务特性31.1.4 不支持的技术...
Iphone睡眠软件音频:熟睡!是由专注在脑波研究与开发领域的LaluzAPP公司推出的重点脑波应用。只需睡前聆听“熟睡!”15分钟(软件默认播放时间),就能轻易获得5倍于平时的深度睡眠效果,安全有效。“熟睡!”经...
iPhone OS系统上的音频单元支持 145 iPhone音频的最佳实践 145 在iPhone OS使用视频 147 录制视频 147 播放视频文件 147 设备支持 150 确定硬件支持是否存在 150 和配件进行通讯 151 配件的基础 151 声明应用程序...
5.创建第一款iPhone应用程序 6.操作和输出口 7.委托(Delegetas) 8.UI元素 9.加速度传感器(accelerometer) 14.SQLite数据库 15.发送电子邮件 16.音频和视频 17.文件处理 18.地图开发 19.应用内购买(App支付功能) 20...
用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...
用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...
用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...
用MediaKit播放音频与视频 使用地址簿、Core Locatjon和传感器 连接网络和Web服务 使MapKit~Google Mobile Maps嵌入地图 使用GameKit构建多人游戏 使用Core Data构建数据驱动的应用 使用StoreKit开发应用内购买的...
本书面向新的iPhone 开发人员,他们马上要开发实际项目,但面对着一个全新的SDK。虽然每位程 序员创建表格的目标和经验并不相同,但大多数人都需要在其开发工作中解决类似的任务:如何构建表格, 如何创建安全的密钥...
本书面向新的iPhone 开发人员,他们马上要开发实际项目,但面对着一个全新的SDK。虽然每位程 序员创建表格的目标和经验并不相同,但大多数人都需要在其开发工作中解决类似的任务:如何构建表格, 如何创建安全的密钥...
本书面向新的iPhone 开发人员,他们马上要开发实际项目,但面对着一个全新的SDK。虽然每位程 序员创建表格的目标和经验并不相同,但大多数人都需要在其开发工作中解决类似的任务:如何构建表格, 如何创建安全的密钥...
1.3 iphone应用程序组件 3 1.3.1 应用程序文件夹层次结构 3 1.3.2 可执行文件 3 1.3.3 info.plist文件 4 1.3.4 图标和默认图像 5 1.3.5 xib(nib)文件 5 1.3.6 应用程序束中不存在的文件 5 1.3.7 沙盒 6 ...
Android应用开发揭秘 Windows操作系统的诞生成就了微软的霸主地位,也造就了PC时代的繁荣。然而,以Android和iPhone手机为代表 的智能移动设备的发明却敲响了PC时代的丧钟!移动互联网时代(3G时代)已经来临,谁...
MusicBox - 音乐播放器 为避免文案复杂化,只有一个(鸟)免费声音文件。 图标:树屋
在 web开发方面,分别介绍了三个 iphone web库,即 webkit、iui和 canvas,并讨论了 web开发环境 dashcode,最后阐述 web应用程序的调试。在 sdk开发方面,详细描述其各种组件和功能,包括 xcode、interface builder...
·如何使用open core、mediaplayer、mediarecorder方便快速地开发出包含音频和视频等流媒体的丰富多媒体应用? ·如何利用android 2.0中新增的蓝牙特性开发包含蓝牙功能的应用?又如何使用蓝牙api来完善应用的...
IOS应用源码——录制音频 demo Recording.zip