用什么技术来构建Apple Watch的Siri波形

时间:2016-05-25 07:21:45

标签: ios iphone uikit core-graphics fft

我正在为iOS构建音乐播放器。 我想要一个可视化器,它与Siri on Apple Watch的波形非常相似。

我在Github找到了看起来很有希望的开源项目。它使用Core Graphics进行绘图,并且很容易理解。但它在iPhone 6上使用了大约50%的CPU,并且在高振幅时它无法达到60 fps。 是否有任何方法可以使用UIKit或SpriteKit来提高性能(注意混合效果 - 这非常重要)?此外,该项目的作者还说了一些关于FFT的内容(在todos中)。我花了将近一天的时间来理解FFT,但我仍然不确定在这种情况下它是如何帮助实现效果的(或者可能变得更高效)。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用SiriWaveView。从github下载。

然后你可以将它的实例化为,

 siriWaveView = [[SCSiriWaveformView alloc]initWithFrame:CGRectMake(20, (self.view.frame.size.height/2) - 160 + 120, self.view.frame.size.width - 40, 80)]; //you can set your desired frame
    siriWaveView.backgroundColor = appGrayColor;

然后你可以设置像

这样的属性
    [siriWaveView setWaveColor:myColor]; //desired color
    [siriWaveView setPrimaryWaveLineWidth:3.0f];
    [siriWaveView setSecondaryWaveLineWidth:1.0];

实施此方法,

  - (void)updateMeters
{  
if (audioPlayer.playing) {


    CGFloat normalizedValue;
    [audioPlayer updateMeters];
    normalizedValue = [self _normalizedPowerLevelFromDecibels:[audioPlayer averagePowerForChannel:0]];
    [siriWaveView updateWithLevel:normalizedValue];
    //  NSLog(@"Update meter called");

}


 }

 - (CGFloat)_normalizedPowerLevelFromDecibels:(CGFloat)decibels
{
if (decibels < -60.0f || decibels == 0.0f) {
    return 0.0f;
}

return powf((powf(10.0f, 0.05f * decibels) - powf(10.0f, 0.05f * -60.0f)) * (1.0f / (1.0f - powf(10.0f, 0.05f * -60.0f))), 1.0f / 2.0f);
}

播放音频或音乐时,如

   displaylink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateMeters)];
    [displaylink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

您可以从该链接中引用演示项目以便更好地理解。

希望这会有所帮助:)