如何为AVPlayer添加均衡器效果?附现有实现代码
为AVPlayer添加均衡器效果的实现方法
要给AVPlayer添加均衡器效果,你需要借助AVAudioEngine、AVAudioPlayerNode和AVAudioUnitEQ来实现——因为AVPlayer本身没有直接提供均衡器接口,我们可以把AVPlayer的音频输出路由到音频引擎,通过均衡器单元处理后再播放。
以下是修改后的完整实现代码:
import UIKit import AVFoundation class ViewController: UIViewController { var player: AVPlayer? // 音频引擎相关组件 private let audioEngine = AVAudioEngine() private let playerNode = AVAudioPlayerNode() private let eqUnit = AVAudioUnitEQ(numberOfBands: 7) // 7频段均衡器 override func viewDidLoad() { super.viewDidLoad() guard let url = URL(string: "https://music.mp3") else { fatalError("Invalid URL") } setupAudioEngine() setupPlayer(with: url) } private func setupAudioEngine() { // 配置均衡器频段参数,这里自定义增益,也可以用预设风格 let frequencies: [Float] = [60, 170, 310, 600, 1000, 3000, 6000] for (index, frequency) in frequencies.enumerated() { guard index < eqUnit.bands.count else { break } let band = eqUnit.bands[index] band.filterType = .parametric band.frequency = frequency band.bandwidth = 1.0 band.gain = 5.0 // 增益范围-40到12,正值提升、负值衰减 } // 将节点添加到音频引擎并建立处理链路 audioEngine.attach(playerNode) audioEngine.attach(eqUnit) audioEngine.connect(playerNode, to: eqUnit, format: nil) audioEngine.connect(eqUnit, to: audioEngine.mainMixerNode, format: nil) // 启动音频引擎 do { try audioEngine.start() } catch { print("音频引擎启动失败: \(error.localizedDescription)") } } private func setupPlayer(with url: URL) { let playerItem = AVPlayerItem(url: url) player = AVPlayer(playerItem: playerItem) // 创建音频输出对象,用于重定向AVPlayer的音频流 let audioOutput = AVPlayerItemAudioOutput() playerItem.add(audioOutput) // 监听播放项状态,准备就绪后再连接音频流 playerItem.addObserver(self, forKeyPath: "status", options: [.new], context: nil) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard keyPath == "status", let playerItem = object as? AVPlayerItem, playerItem.status == .readyToPlay else { return } // 启动播放并将AVPlayer的音频流路由到处理节点 playerNode.play() player?.play() if let audioOutput = playerItem.audioOutputs.first { playerNode.setPlayerItemAudioOutput(audioOutput) } } deinit { player?.currentItem?.removeObserver(self, forKeyPath: "status") audioEngine.stop() playerNode.stop() } }
关键部分说明:
- 均衡器配置:初始化时指定频段数量,每个频段可设置频率、增益和带宽。也可以直接加载系统预设快速实现风格化效果:
eqUnit.loadFactoryPreset(.rock) // 加载摇滚预设 eqUnit.globalGain = 2.0 // 全局增益补偿 - 音频链路搭建:按
playerNode → 均衡器 → 主混音器的顺序连接节点,确保音频流经过均衡器处理后再输出。 - 音频流重定向:通过
AVPlayerItemAudioOutput把AVPlayer的音频输出转到音频引擎的节点,实现均衡器对AVPlayer音频的处理。 - 状态监听:必须等待
AVPlayerItem状态变为readyToPlay后再连接音频流,避免播放异常。
内容的提问来源于stack exchange,提问作者Vector
相关产品推荐
相关产品推荐

