Kev*_*jan 6 avfoundation ios swift avaudioengine avaudioplayernode
我想制作一个5频段音频均衡器(60Hz,230Hz,910Hz,4kHz,14kHz)AVAudioEngine.我希望通过垂直滑块获得每个频段的用户输入增益,并相应地调整正在播放的音频.我尝试过AVAudioUnitEQ这样做,但是在播放音频时听不到任何区别.我试图在值中硬编码以指定每个频率的增益,但它仍然不起作用.这是我的代码:
var audioEngine: AVAudioEngine = AVAudioEngine()
var equalizer: AVAudioUnitEQ!
var audioPlayerNode: AVAudioPlayerNode = AVAudioPlayerNode()
var audioFile: AVAudioFile!
// in viewDidLoad():
equalizer = AVAudioUnitEQ(numberOfBands: 5)
audioEngine.attach(audioPlayerNode)
audioEngine.attach(equalizer)
let bands = equalizer.bands
let freqs = [60, 230, 910, 4000, 14000]
audioEngine.connect(audioPlayerNode, to: equalizer, format: nil)
audioEngine.connect(equalizer, to: audioEngine.outputNode, format: nil)
for i in 0...(bands.count - 1) {
bands[i].frequency = Float(freqs[i])
}
bands[0].gain = -10.0
bands[0].filterType = .lowShelf
bands[1].gain = -10.0
bands[1].filterType = .lowShelf
bands[2].gain = -10.0
bands[2].filterType = .lowShelf
bands[3].gain = 10.0
bands[3].filterType = .highShelf
bands[4].gain = 10.0
bands[4].filterType = .highShelf
do {
if let filepath = Bundle.main.path(forResource: "song", ofType: "mp3") {
let filepathURL = NSURL.fileURL(withPath: filepath)
audioFile = try AVAudioFile(forReading: filepathURL)
audioEngine.prepare()
try audioEngine.start()
audioPlayerNode.scheduleFile(audioFile, at: nil, completionHandler: nil)
audioPlayerNode.play()
}
} catch _ {}
Run Code Online (Sandbox Code Playgroud)
由于低频的增益为-10,而高频的增益为10,因此在播放任何媒体时应该有非常明显的差异.但是,当媒体开始播放时,听起来就像没有连接任何均衡器一样播放.
我不确定为什么会这样,但我尝试了几个不同的东西来调试.我认为它可能是函数的顺序,所以我尝试切换它,以便在调整所有波段后调用audioEngine.connect,但这也没有任何区别.
我尝试使用一个相同的代码AVAudioUnitTimePitch,它工作得很好,所以我很傻到为什么它不起作用AVAudioUnitEQ.
我不想在这个项目中使用任何第三方库或可可豆荚,我想AVFoundation单独使用它.
任何帮助将不胜感激!
提前致谢.
Kev*_*jan 10
AVAudioUnitEQFilterParameters
通过文档查看,我注意到我已经搞乱了所有参数bypass,但似乎更改此标志修复了所有内容!
所以,我认为这里的主要问题是每个AVAudioUnitEQ频段不能被提供的系统值而不是程序员设置的值绕过.
所以,我改变了
for i in 0...(bands.count - 1) {
bands[i].frequency = Float(freqs[i])
}
Run Code Online (Sandbox Code Playgroud)
至
for i in 0...(bands.count - 1) {
bands[i].frequency = Float(freqs[i])
bands[i].bypass = false
bands[i].filtertype = .parametric
}
Run Code Online (Sandbox Code Playgroud)
一切都开始奏效了.此外,为了制作一个允许用户修改各个频率的有效均衡器,filtertype应将每个频带设置为.parametric.
我仍然不确定应该将带宽设置为什么,但我可以在网上检查或者只是弄乱它,直到声音匹配不同的均衡器应用程序.
| 归档时间: |
|
| 查看次数: |
2748 次 |
| 最近记录: |