在 iOS 中构建高级均衡器

Posted

技术标签:

【中文标题】在 iOS 中构建高级均衡器【英文标题】:Build advance equaliser in iOS 【发布时间】:2014-08-12 10:09:57 【问题描述】:

我使用 AVplayer 构建了一个音乐播放器应用。该应用程序可以访问和播放 iPod 库中的歌曲。这就是我使用 AVPlayer 播放 mediaItem 的方式

MPMediaItem *mediaItem = ...
NSURL *assetUrl = [mediaItem valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:assetUrl];
self.player = [AVPlayer playerWithPlayerItem:playerItem];

我需要在我的应用中添加图形均衡器以允许用户更改以下值

ios 中的音频处理似乎与其他框架不同。我做了一个研发,发现

音频单元 MTAudioProcessingTap NVDSP 新卡因 OpenAL

我的问题是, 是否可以使用 AVPlayer 创建自定义均衡器? 我应该使用什么技术来满足我的需求(使用 AVPlayer 创建自定义均衡器)?

附:谁能给出一个简单的工作示例,我可以将其添加到项目中并检查歌曲中的更改(我尝试了苹果文档,但不清楚)

更新

顺便说一句,我建立了自己的 eq 和处理库 https://github.com/clementprem/CPAudioPlayer

【问题讨论】:

嘿,也许这个链接会有所帮助,***.com/questions/4029079/…> @Clement Prem:您能否在您的 Github 存储库中提供一个示例?非常感谢。 【参考方案1】:

AVPlayer 对你没用,因为它只提供高级接口。

我前段时间实现了一个音频均衡器,我的建议是使用 Novocaine,它使用 NVDSP 和音频单元(实际上使它更简单)。 Novocaine 甚至包含一个 Equalizer 类,因此您只需将其集成到您的应用程序中(如果您不进行流式传输,那真的很简单)。

【讨论】:

我需要支持音乐应用程序的后台和远程控制事件处理以及其他基本功能。 Novocaine 可以吗? 背景、遥控器等都可以用音频单元。 novocaine 确实为您提供了几乎现成的解决方案。 AVPlayer 提供了一个非常简单的接口,音频单元就是你所需要的。 我同意。我在KREAFUNK 中做了这个。您需要构建自己的音频图或使用第 3 方库,例如 Novocaine 或 The Amazing Audio Engine。 @Trenskow 我检查了你的应用,它很酷。你用什么均衡器和音乐播放器? (希望你没有任何与保密协议相关的问题:)) 我使用 AUGraph 和 AudioUnit API 构建了一个音频图。这不适合胆小的人。 C API 和非常严格的线程同步问题。如果我应该重新开始,我想我今天会使用像 Novocaine 这样的东西。 :)【参考方案2】:

这可以通过 NOVOCAINE 来完成。

拿代码来实例化一个 NVPeakingEQFilter:

    NVPeakingEQFilter* PEQ = [[NVPeakingEQFilter alloc] initWithSamplingRate:self.samplingRate];
    PEQ.Q = QFactor;
    PEQ.G = gain;
    PEQ.centerFrequency = centerFrequencies;

您需要定义 3 个参数:Q、G 和 centerFrequency。 Q 和 centerFrequency 通常都是固定的(在我的例子中 QFactor 是一个等于 2.0 的常数)。

所以,您有 10 个滑块:每个滑块对应一个固定的 centerFrequency。我建议 iTunes 值:32Hz、64Hz、125Hz、250Hz、500Hz、1KHz、2KHz、4KHz、8KHz、16KHz。您不想在滑块值更改时更改这些值。

当滑块值发生变化时,您要更改的是增益 (G)。在初始化时,G 可以设置为 0.0。这意味着“没有放大/衰减”。

当滑块移动时,你会改变 G,所以实际上你会这样做:

PEQ[sender.tag - 1].G = sender.value * kNominalGainRange;

其中 kNominalGainRange 为 12.0,因此如果 sender.value 从 -1.0 变为 +1.0,则 G 从 -12 变为 +12。

希望这会有所帮助。

【讨论】:

我从零开始写了一个 AUGraph 库:) 我来不及写这个答案:) 我没试过,只是看了一些代码,才发现NVPeakingEQFilter是一个NVDSP库的类。所以也许你需要添加两个库: - github.com/alexbw/novocaine - github.com/bartolsthoorn/NVDSP

以上是关于在 iOS 中构建高级均衡器的主要内容,如果未能解决你的问题,请参考以下文章

精通springcloud:高级负载均衡和断路器

Nginx高级应用--负载均衡rewrite规则

KubeSphere 社区开源负载均衡器 Porter 进入 CNCF 云原生全景图

HAProxy实现高级负载均衡实战和ACL控制

VCN专题 | NSX高级负载均衡助推企业应用的容器化转型

构建一个简单的均衡器