使用 AVAudioPlayer 播放音频
音频播放是很多应用程序的常见需求, AV Foundation 提供了一个 AVAudioPlayer
的类使得音频播放的实现变得非常简单。使用 AVAudioPlayer
,我们可以:
- 从文件或内存中播放任何持续时间的音频
- 控制播放音频的音量、平移、速率和循环行为
- 访问播放级计量数据
- 通过同步多个播放器的播放同时播放多个声音
创建音频播放器
有两种方法可以创建一个 AVAudioPlayer
,使用包含要播放音频的 NSData
或者本地音频文件的 NSURL
。下面示例演示了如何使用音频文件路径创建一个 AVAudioPlayer
实例:
- (AVAudioPlayer *)playerForFile:(NSString *)name {
NSURL *fileURL = <#音频路径#>;
NSError *error;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
error:&error];
if (player) {
[player prepareToPlay];
} else {
NSLog(@"Error creating player: %@", [error localizedDescription]);
}
return player;
}
如果创建了一个有效的播放示例,建议开发者调用其 prepareToPlay
方法,这样做会取得需要的音频硬件并预加载 Audio Queue 的缓冲区。调用 prepareToPlay
方法可以在创建时准备播放器,从而降低调用 play
方法和听到声音输出之间的延时。
对播放进行控制
AVAudioPlayer
实例包含了所有开发者期望的对播放行为进行控制的方法,调用 play
方法可以实现立即播放音频的功能, pause
方法可以对播放暂停,而 stop
方法可以停止播放行为。 pause
和 stop
两种最主要的区别是在底层处理上, 调用 stop
方法会撤销调用 prepareToPlay
时所做的设置,而调用 pause
方法不会。
除此之外,还可以使用其它方法,如下所示:
- 通过设置
volume
修改播放器的音量,从 0.0 ~ 1.0; - 通过设置
pan
修改音频播放器的立体声平移,从 -1.0 ~ 1.0; - 通过设置
rate
调整播放速度,从 0.5 ~ 2.0; - 通过设置
numberOfLoops
实现循环播放次数
使用 AVAudioRecorder 录制音频
AVAudioRecorder
同其用于播放音频的兄弟类一样,构建于 Audio Queue Services 之上,我们可以使用这个功能从内置的麦克风或者外部音频设备进行录制。
使用AVAudioRecorder
可以:
- 从系统的活动输入设备录制音频
- 录制指定的持续时间或直到用户停止录制
- 暂停和恢复录制
- 访问记录计量数据
创建 AVAudioRecorder
创建 AVAudioRecorder
实例时需要为其提供数据的一些信息,分别是:
- 用于表示音频流写入文件的本地文件
URL
- 包含用于配置录音会话键值信息的
NSDictionary
对象 - 用于捕捉初始化阶段各种错误的
NSError
指针
NSURL *fileURL = <#表示音频流写入文件的本地文件#>;
NSDictionary *settings = @{
AVFormatIDKey : @(kAudioFormatAppleIMA4),
AVSampleRateKey : @44100.0f,
AVNumberOfChannelsKey : @1,
AVEncoderBitDepthHintKey : @16,
AVEncoderAudioQualityKey : @(AVAudioQualityMedium)
};
NSError *error;
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
} else {
NSLog(@"Error: %@", [error localizedDescription]);
}
成功创建 AVAudioRecorder
实例后,建议调用 prepareToRecord
方法。这个方法执行底层 Audio Queue 初始化的必要过程。该方法还会在参数指定的位置创建一个文件。
录音配置参数
开发者可以配置录音会话的完整键值信息在 <AVFoundation/AVAudioSettings.h>
中定义,大部分的键都专门定义了特有的格式,如下所示一些通用的格式:
-
AVFormatIDKey
音频格式kAudioFormatLinearPCM
kAudioFormatMPEG4AAC
kAudioFormatAppleLossless
kAudioFormatAppleIMA4
kAudioFormatiLBC
kAudioFormatULaw
-
AVSampleRateKey
采样率 -
AVNumberOfChannelsKey
通道数
控制录音过程
创建了 AVAudioRecorder
实例后,就可以开始录音了。 和 AVAudioPlayer
类似地, AVAudioRecorder
同样包含了对录制行为进行控制的方法如下所示:
- 调用
record
开始无限时长的录制 - 调用
recordAtTime
在未来某一时间点开始录制 - 调用
recordForDuration
录制指定时长的内容 - 调用
pause
暂停录制 - 调用
stop
停止录制
使用 Audio Metering
AVAudioRecorder
和 AVAudioPlayer
中最强大和最实用的功能就是对音频进行测量。 Audio Metering 可以让开发者读取音频的平均分贝和峰值分贝数据,并使用这些数据以可视化方式将声音的大小呈现给用户。
两个类使用的方法都是 averagePowerForChannel:
和 peakPowerForChannel:
。两个方法会返回一个用于表示声音分贝(dB)等级的浮点数。这个值的范围从表示最大分贝的 0 dB 到表示最小分贝的 -160 dB。
在读取这些值之前,首先要通过设置 meteringEnable
属性为 true
才可以对音频进行测量。每当需要读值时,要先调用 updateMeters
方法才能获取最新的值。
网友评论