AV Foundation ⑩ 音频播放与录入

使用 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 方法可以停止播放行为。 pausestop 两种最主要的区别是在底层处理上, 调用 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 初始化的必要过程。该方法还会在参数指定的位置创建一个文件。

录音配置参数

    开发者可以配置录音会话的完整键值信息在 中定义,大部分的键都专门定义了特有的格式,如下所示一些通用的格式:

  • AVFormatIDKey 音频格式

    • kAudioFormatLinearPCM
    • kAudioFormatMPEG4AAC
    • kAudioFormatAppleLossless
    • kAudioFormatAppleIMA4
    • kAudioFormatiLBC
    • kAudioFormatULaw
  • AVSampleRateKey 采样率

  • AVNumberOfChannelsKey 通道数

控制录音过程

    创建了 AVAudioRecorder 实例后,就可以开始录音了。 和 AVAudioPlayer 类似地, AVAudioRecorder 同样包含了对录制行为进行控制的方法如下所示:

  • 调用 record 开始无限时长的录制
  • 调用 recordAtTime 在未来某一时间点开始录制
  • 调用 recordForDuration 录制指定时长的内容
  • 调用pause 暂停录制
  • 调用 stop 停止录制

使用 Audio Metering

    AVAudioRecorderAVAudioPlayer 中最强大和最实用的功能就是对音频进行测量。 Audio Metering 可以让开发者读取音频的平均分贝和峰值分贝数据,并使用这些数据以可视化方式将声音的大小呈现给用户。
    两个类使用的方法都是 averagePowerForChannel:peakPowerForChannel:。两个方法会返回一个用于表示声音分贝(dB)等级的浮点数。这个值的范围从表示最大分贝的 0 dB 到表示最小分贝的 -160 dB。
    在读取这些值之前,首先要通过设置 meteringEnable 属性为 true 才可以对音频进行测量。每当需要读值时,要先调用 updateMeters 方法才能获取最新的值。

你可能感兴趣的:(AV Foundation ⑩ 音频播放与录入)