gpt4 book ai didi

ios - 无法同时录制/播放 AudioQueue 和动画

转载 作者:行者123 更新时间:2023-11-29 04:33:00 25 4
gpt4 key购买 nike

在我的应用程序中,我尝试在一台设备上录制、传输并在另一台设备上播放。我想为录音设备和播放设备上的声级设置动画。

我用于录制、回放和动画的大部分代码都来自 SpeakHere示例应用程序。

但我有两个不同之处:

  • 我有通过网络传输的额外开销。
  • 我尝试使用图像(如下所示)制作水平动画,而不是像 SpeakHere 中那样使用彩色 strip

Animation

我在单独的调度队列(GCD)上进行录制和传输,并且用于接收和播放。

  • 我的第一个问题是:当我引入动画时,接收和播放变得非常慢,并且 AudioQueue 变得无声。
  • 我的下一个问题是为 LevelMeter View 设置清晰的背景。如果我这样做,那么动画就会出现乱码。不确定动画如何连接到背景颜色。

下面是我的 SpeakHere 示例中的(没有经过如此优雅修改的)drawRect 版本。请对我可能犯的任何错误提出建议。

我的理解是,由于 UIKit 的原因,我无法在此处使用另一个线程来实现动画。如果不对请指正。

- (void)drawRect:(CGRect)rect
{
//();
CGContextRef cxt = NULL;
cxt = UIGraphicsGetCurrentContext();

CGColorSpaceRef cs = NULL;
cs = CGColorSpaceCreateDeviceRGB();

CGRect bds;


if (_vertical)
{
CGContextTranslateCTM(cxt, 0., [self bounds].size.height);
CGContextScaleCTM(cxt, 1., -1.);
bds = [self bounds];
} else {
CGContextTranslateCTM(cxt, 0., [self bounds].size.height);
CGContextRotateCTM(cxt, -M_PI_2);
bds = CGRectMake(0., 0., [self bounds].size.height, [self bounds].size.width);
}

CGContextSetFillColorSpace(cxt, cs);
CGContextSetStrokeColorSpace(cxt, cs);

if (_numLights == 0)
{
int i;
CGFloat currentTop = 0.;

if (_bgColor)
{
[_bgColor set];
CGContextFillRect(cxt, bds);
}

for (i=0; i<_numColorThresholds; i++)
{
LevelMeterColorThreshold thisThresh = _colorThresholds[i];
CGFloat val = MIN(thisThresh.maxValue, _level);

CGRect rect = CGRectMake(
0,
(bds.size.height) * currentTop,
bds.size.width,
(bds.size.height) * (val - currentTop)
);

[thisThresh.color set];
CGContextFillRect(cxt, rect);

if (_level < thisThresh.maxValue) break;

currentTop = val;
}

if (_borderColor)
{
[_borderColor set];
CGContextStrokeRect(cxt, CGRectInset(bds, .5, .5));
}

}
else
{
int light_i;
CGFloat lightMinVal = 0.;
CGFloat insetAmount, lightVSpace;
lightVSpace = bds.size.height / (CGFloat)_numLights;
if (lightVSpace < 4.) insetAmount = 0.;
else if (lightVSpace < 8.) insetAmount = 0.5;
else insetAmount = 1.;

int peakLight = -1;
if (_peakLevel > 0.)
{
peakLight = _peakLevel * _numLights;
if (peakLight >= _numLights) peakLight = _numLights - 1;
}

for (light_i=0; light_i<_numLights; light_i++)
{
CGFloat lightMaxVal = (CGFloat)(light_i + 1) / (CGFloat)_numLights;
CGFloat lightIntensity;
CGRect lightRect;
UIColor *lightColor;

if (light_i == peakLight)
{
lightIntensity = 1.;
}
else
{
lightIntensity = (_level - lightMinVal) / (lightMaxVal - lightMinVal);
lightIntensity = LEVELMETER_CLAMP(0., lightIntensity, 1.);
if ((!_variableLightIntensity) && (lightIntensity > 0.)) lightIntensity = 1.;
}

lightColor = _colorThresholds[0].color;
int color_i;
for (color_i=0; color_i<(_numColorThresholds-1); color_i++)
{
LevelMeterColorThreshold thisThresh = _colorThresholds[color_i];
LevelMeterColorThreshold nextThresh = _colorThresholds[color_i + 1];
if (thisThresh.maxValue <= lightMaxVal) lightColor = nextThresh.color;
}

lightRect = CGRectMake(
0.,
bds.size.height * ((CGFloat)(light_i) / (CGFloat)_numLights),
bds.size.width,
bds.size.height * (1. / (CGFloat)_numLights)
);
lightRect = CGRectInset(lightRect, insetAmount, insetAmount);

if (_bgColor)
{
[_bgColor set];
CGContextFillRect(cxt, lightRect);
}

UIImage* image = [UIImage imageNamed:@"Pearl.png"];
CGImageRef imageRef = image.CGImage;


if (lightIntensity == 1.)
{
CGContextDrawImage(cxt, lightRect, imageRef);

[lightColor set];
//CGContextFillRect(cxt, lightRect);
} else if (lightIntensity > 0.) {
CGColorRef clr = CGColorCreateCopyWithAlpha([lightColor CGColor], lightIntensity);
CGContextSetFillColorWithColor(cxt, clr);
//CGContextFillRect(cxt, lightRect);
CGContextDrawImage(cxt, lightRect, imageRef);

CGColorRelease(clr);
}

if (_borderColor)
{
[_borderColor set];
CGContextStrokeRect(cxt, CGRectInset(lightRect, 0.5, 0.5));
}

lightMinVal = lightMaxVal;
}
}

CGColorSpaceRelease(cs);
}

最佳答案

您的绘图可能太慢,这可能会干扰对音频队列回调的实时响应要求。

但是由于您主要绘制一堆静态图像,因此您可能需要考虑将每个点放在自己单独的 ImageView 中。您只需通过隐藏和取消隐藏 subview 即可控制显示的点数,根本不需要任何drawRect代码。

关于ios - 无法同时录制/播放 AudioQueue 和动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440338/

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