iOS音频开发功能

来源:互联网 发布:three.js 全景视频 编辑:程序博客网 时间:2024/05/18 00:01
声音的用处 •声效
■ 点击按钮
■ 警告声
■ 用户动作伴随的短声
• 任意长度的声音(音乐,播客,讲话内容) • 来自网络服务的音频流
• 录制的声音
这会有多难?
• 在一个多功能的移动设备上播放声音可能令人惊讶 的复杂
■ 可能同时有多个来源
■ 无数可能的输出
■ 变幻的事件,可能超出用户的控制 ■ 给看上去类似的动作不同的优先级
• 操作系统管理声音系统
■ 再一次,你只需简单的搭它的车


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. 停止该队列


■ 更多细节查看iPhone Dev Center的示例项目 SpeakHere
原创粉丝点击