跳到主要内容

音频处理

问题

iOS 音频播放和录制的核心 API?

答案

AVAudioSession

所有音频操作前必须配置 AudioSession:

import AVFoundation

// 配置音频会话
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker])
try session.setActive(true)
Category说明
.ambient不打断其他音频(游戏背景音)
.playback独占播放(音乐播放器)
.record录音
.playAndRecord同时播放和录音(语音通话)

AVAudioPlayer(简单播放)

let player = try AVAudioPlayer(contentsOf: audioURL)
player.prepareToPlay()
player.play()

AVAudioEngine(音频处理链)

let engine = AVAudioEngine()
let playerNode = AVAudioPlayerNode()
let reverb = AVAudioUnitReverb()

engine.attach(playerNode)
engine.attach(reverb)

// 连接节点链
engine.connect(playerNode, to: reverb, format: nil)
engine.connect(reverb, to: engine.mainMixerNode, format: nil)

reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 50

try engine.start()
playerNode.scheduleFile(audioFile, at: nil)
playerNode.play()

常见面试问题

Q1: 后台音频播放怎么实现?

答案

  1. 开启 Background Modes → Audio
  2. 设置 AVAudioSession.category.playback
  3. 设置 session.setActive(true)
  4. 处理中断(来电、其他 App 播放):监听 AVAudioSession.interruptionNotification

相关链接