声音的用处 •声效
■ 点击按钮 ■ 警告声 ■ 用户动作伴随的短声
• 任意长度的声音(音乐,播客,讲话内容) • 来自网络服务的音频流 • 录制的声音
这会有多难?
• 在一个多功能的移动设备上播放声音可能令人惊讶 的复杂
■ 可能同时有多个来源
■ 无数可能的输出
■ 变幻的事件,可能超出用户的控制 ■ 给看上去类似的动作不同的优先级
• 操作系统管理声音系统 ■ 再一次,你只需简单的搭它的车
CoreAudio
• 高层级,容易使用 ■ System Sound API - 短的声音
■ AVAudioPlayer class - ObjC,简单API
• 低层级,花费更多努力,但是有更多控制
▪ AudioToolbox-录制和播放,流处理,完全的控制
▪ Audio Units - 处理声音
▪ OpenAL - 3D定位的声音 • 使用哪个取决于你要做什么 ■ 许多情况下满意于系统声音和AVAudioPlayer
▪
▪ 播放短音 • "短"指少于30秒
▪ • 非常简单的API,但是有限制 ■ 不能重复
▪ ■ 没有音量控制 ■ 立刻播放 ■ 有限的格式
▪ ■ 线性化的PCM或IMA4 ■ .caf,.aif或.wav文件
播放短音
• 两步的过程 ■ 注册这个声音,返回一个"声音ID“ ■ 播放声音 ■ 当声音播放结束时可选择是否运行回调函数
NSURL *fileURL = ... // 一个文件的地址 SystemSoundID myID;
// 先注册这个声音 AudioServicesCreateSystemSoundID ((CFURLRef)fileURL, &myID);
// 现在可以播放这个声音 AudioServicesPlaySystemSound (myID);
播放短音 •清理
■ 当你完成时清除声音ID ■ 否则你会得到一个内存警告
SystemSoundID myID;
// 清除前面注册的声音 AudioServicesDisposeSystemSoundID (myID);
体会你的声音 • 系统的声音API允许促发手机的振动
• 使用这个特定的系统声音ID kSystemSoundID_Vibrate ■ 在iPod touch上不做任何事情
- (void)vibrate { // 促发手机的振动
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
转换声音 • 转换声音的命令行工具
/usr/bin/afconvert
• 支持各种输入和输出格式 • 细节请查看man的页面
• 可以容易的转换声音为系统声音格式 /usr/bin/afconvert -f aiff -d BEI16 input.mp3 output.aif
播放长音 • iPhone OS 2.1之前的版本里,你必须使用低层级的
CoreAudio APIs
■ 可能会很复杂,很麻烦 • iPhone OS 2.2引入了ObjC类来处理简单的音频播放
■ AVAudioPlayer • 如果你要在期末项目里使用声音,更新到2.2版
AVAudioPlayer
• 播放长音(超过30秒)
• 本地存储的文件或内存里的(或来自网络流)
• 能够循环,跳动,播放,暂停
• 提供音量信息
• 同时播放多个声音
• Cocoa-风格的 API ■ 从文件地址或数据初始化
■ 允许代理
AVAudioPlayer
• 从文件地址或数据生成 AVAudioPlayer *player;
NSString *path = [[NSBundle mainBundle] pathForResource...];
NSURL *url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url]; • 简单的开始/停止方法
if (!player.playing) {
[player play];
} else {
[player pause];
}
AVAudioPlayerDelegate
• 告知什么时候播放停止
• 告知音频解码错误
• 提供处理中断的接口 ■ Oh,这些讨厌的中断
Audio Sessions
• 操作系统需要知道你在对声音做什么 ■ 开始玩游戏或收听播客,然后锁定设置...什么会发生?
■ 如果你玩的是一个射击游戏并用发声/静音开关来静音... 什么会发生?
• 提供了一种方式让你表达你的音频目的 ■ Categories被定义用来弄清
■ 环境声 ■ 媒体播放 ■ 录制 ■ 播放和录制
默认Sessions
• 应用程序获得默认session时会 ■ 当播放你的声音时(比如iPod音频)其他声音被静音 ■ 使用发声/静音开关 ■ 当用户锁定设备时静音
• 对许多应用程序这不错,但是不一定适合你的应用程序 ■ 如果这样,你需要使用Audio Session APIs
■ 点击按钮 ■ 警告声 ■ 用户动作伴随的短声
• 任意长度的声音(音乐,播客,讲话内容) • 来自网络服务的音频流 • 录制的声音
这会有多难?
• 在一个多功能的移动设备上播放声音可能令人惊讶 的复杂
■ 可能同时有多个来源
■ 无数可能的输出
■ 变幻的事件,可能超出用户的控制 ■ 给看上去类似的动作不同的优先级
• 操作系统管理声音系统 ■ 再一次,你只需简单的搭它的车
CoreAudio
• 高层级,容易使用 ■ System Sound API - 短的声音
■ AVAudioPlayer class - ObjC,简单API
• 低层级,花费更多努力,但是有更多控制
▪ AudioToolbox-录制和播放,流处理,完全的控制
▪ Audio Units - 处理声音
▪ OpenAL - 3D定位的声音 • 使用哪个取决于你要做什么 ■ 许多情况下满意于系统声音和AVAudioPlayer
▪
▪ 播放短音 • "短"指少于30秒
▪ • 非常简单的API,但是有限制 ■ 不能重复
▪ ■ 没有音量控制 ■ 立刻播放 ■ 有限的格式
▪ ■ 线性化的PCM或IMA4 ■ .caf,.aif或.wav文件
播放短音
• 两步的过程 ■ 注册这个声音,返回一个"声音ID“ ■ 播放声音 ■ 当声音播放结束时可选择是否运行回调函数
NSURL *fileURL = ... // 一个文件的地址 SystemSoundID myID;
// 先注册这个声音 AudioServicesCreateSystemSoundID ((CFURLRef)fileURL, &myID);
// 现在可以播放这个声音 AudioServicesPlaySystemSound (myID);
播放短音 •清理
■ 当你完成时清除声音ID ■ 否则你会得到一个内存警告
SystemSoundID myID;
// 清除前面注册的声音 AudioServicesDisposeSystemSoundID (myID);
体会你的声音 • 系统的声音API允许促发手机的振动
• 使用这个特定的系统声音ID kSystemSoundID_Vibrate ■ 在iPod touch上不做任何事情
- (void)vibrate { // 促发手机的振动
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
转换声音 • 转换声音的命令行工具
/usr/bin/afconvert
• 支持各种输入和输出格式 • 细节请查看man的页面
• 可以容易的转换声音为系统声音格式 /usr/bin/afconvert -f aiff -d BEI16 input.mp3 output.aif
播放长音 • iPhone OS 2.1之前的版本里,你必须使用低层级的
CoreAudio APIs
■ 可能会很复杂,很麻烦 • iPhone OS 2.2引入了ObjC类来处理简单的音频播放
■ AVAudioPlayer • 如果你要在期末项目里使用声音,更新到2.2版
AVAudioPlayer
• 播放长音(超过30秒)
• 本地存储的文件或内存里的(或来自网络流)
• 能够循环,跳动,播放,暂停
• 提供音量信息
• 同时播放多个声音
• Cocoa-风格的 API ■ 从文件地址或数据初始化
■ 允许代理
AVAudioPlayer
• 从文件地址或数据生成 AVAudioPlayer *player;
NSString *path = [[NSBundle mainBundle] pathForResource...];
NSURL *url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url]; • 简单的开始/停止方法
if (!player.playing) {
[player play];
} else {
[player pause];
}
AVAudioPlayerDelegate
• 告知什么时候播放停止
• 告知音频解码错误
• 提供处理中断的接口 ■ Oh,这些讨厌的中断
Audio Sessions
• 操作系统需要知道你在对声音做什么 ■ 开始玩游戏或收听播客,然后锁定设置...什么会发生?
■ 如果你玩的是一个射击游戏并用发声/静音开关来静音... 什么会发生?
• 提供了一种方式让你表达你的音频目的 ■ Categories被定义用来弄清
■ 环境声 ■ 媒体播放 ■ 录制 ■ 播放和录制
默认Sessions
• 应用程序获得默认session时会 ■ 当播放你的声音时(比如iPod音频)其他声音被静音 ■ 使用发声/静音开关 ■ 当用户锁定设备时静音
• 对许多应用程序这不错,但是不一定适合你的应用程序 ■ 如果这样,你需要使用Audio Session APIs
高级音频
音频文件流服务和音频队列服务
支持各种格式
更多对回访的控制
播放音频流到网络高级音频
• 录制声音
■ 音频队列服务(简述)
1. 生成一个队列
2. 定义一个回调函数来接收录制的音频数据
3. 开始队列
4. 接收回调函数的录制数据,你必须保存它
5. 停止该队列