You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:16:10