gpt4 book ai didi

iphone - 如何为更逼真的模拟VU表平滑音频电平表?

转载 作者:行者123 更新时间:2023-12-02 22:47:53 27 4
gpt4 key购买 nike

我为录音应用程序构建了一个模拟Analog VU Meter,除了一个方面之外,所有内容均已正确连接并按照我期望的方式工作。如果您正在使用VU仪表,请注意odt_a,您会看到指针在整个位置弹跳,而不是真正的VU仪表会发生的情况。有关我要寻找的示例,请尝试使用Apple“Voice Memos”应用程序并查看。

到目前为止,我的逻辑很简单:

#define VU_METER_FREQUENCY                                      1.0/5.0

- (void)someMethod {
_updateTimer = [NSTimer
scheduledTimerWithTimeInterval:VU_METER_FREQUENCY
target:self
selector:@selector(_refresh)
userInfo:nil
repeats:YES];
}

- (void)_refresh {
// if we have no queue, but still have levels, gradually bring them down
if (_delegate == nil) {
CFAbsoluteTime thisFire = CFAbsoluteTimeGetCurrent();
// calculate how much time passed since the last draw
CFAbsoluteTime timePassed = thisFire - _peakFalloffLastFire;
needleValue = needleValue - timePassed * VU_METER_LEVEL_FALL_OFF_PER_SECOND;
if (needleValue < VU_METER_MIN_DB) {
needleValue = VU_METER_MIN_DB;
TT_INVALIDATE_TIMER(_updateTimer);
}
_peakFalloffLastFire = thisFire;
} else {
prevNeedleValue = needleValue;
needleValue = [_delegate currentDB];
}
[self updateNeedle];
}

- (void)updateNeedle {
[UIView beginAnimations:nil context:NULL]; // arguments are optional
[UIView setAnimationDuration:VU_METER_FREQUENCY];
[UIView setAnimationCurve:(needleValue > prevNeedleValue ? UIViewAnimationCurveEaseOut : UIViewAnimationCurveEaseIn)];
CGFloat radAngle = [self radianAngleForValue:needleValue];
self.needle.transform = CGAffineTransformMakeRotation(radAngle);
[UIView commitAnimations];
}

基本上,我设置了一个计时器,使其在 VU_METER_FREQUENCY上运行,并使用UIView动画更新了针的旋转,并有缓和的倾向,这优先于保持针的高度。我正在寻找一种以某种方式进行调整以提供更平滑的指针的方法,我的基准尽可能接近苹果的模拟VU表。为了获取 needleValue,我使用 AudioQueuemAveragePower并在每次调用 currentDB时对其进行查询。我该如何解决?

最佳答案

我建议的一件事就是改变这一点。

#define VU_METER_FREQUENCY    1.0/5.0

也就是说每秒更新5倍,问题是我认为苹果将容纳0.2秒的采样,因此您实际上是获得声音的平均值,因此仪表实际上并没有跟随声音的高低波动,而是更多较低的平均值。

我认为此设置可以高达1.0 / 60(60hz)。

至于使仪表平滑,这有点麻烦。

你可以做这样的事情。
  • 创建一个包含7-8个值的数组。
  • 每次获取读数时,将其添加到数组中并弹出的第7个值(例如,仅保留最后七个值。
  • 查找数组的平均值(将数组求和/除以数组中元素的数量。
  • 显示此平均值。

  • 因此,这有点像填满管道,一旦停止填充,将需要一些时间将其排空,针头会慢慢掉落。

    或者,您只能在每个循环中仅允许针头跌落那么多。

    可以说针摆动为0(最低值)和1(最高值,最右侧)。
    假设您以20hz(每秒20x次)进行采样。

    每次更新位置时,只允许针上升(最大值为0.1)和下降(最大值为0.05)。

    您可以执行类似的操作,并使用这些值来使它变得美观流畅。
    if newValue>currentMeterValue
    currentMeterValue = Min(currentMeterValue + 0.1, newValue);
    else
    currentMeterValue = Max(currentMeterValue - 0.05, newValue);

    要么

    您只需简单地以与每个值之间的距离成比例的速率移动仪表(这应该很好地使其平滑),并且实际上将 Spring 推向由电磁铁供电的指针,就可以接近实际仪表。
       currentMeterValue += (newValue - currentMeterValue)/4.0;

    关于iphone - 如何为更逼真的模拟VU表平滑音频电平表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4252695/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com