0

我想UIImageView根据 peakPowerForChannel 为png 图像的 alpha 设置动画AVAudioPlayer。我没有任何错误或崩溃,但它不起作用。以下是(我相信的)我的 ViewController 代码的相关部分:

。H

@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
@property(getter = isMeteringEnabled) BOOL meteringEnabled;
@property (weak, nonatomic) IBOutlet UIImageView *mouthMeter;
- (void)updateMouthMeter:(id) sender;

.m

- (void)viewDidLoad{ 
... 
self.meterTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self       selector:@selector(updateMouthMeter:) userInfo:NULL repeats:YES];
}

-(void)updateMouthMeter : (id)sender {
[self.audioPlayer updateMeters];
float level = [self.audioPlayer peakPowerForChannel:0];
[UIView beginAnimations:nil context:NULL];
self.mouthMeter.alpha = level;
[UIView commitAnimations];
}

我认为我的问题在于AVAudioPlayer输出 0.0dB 的 MAX 和 -160dB 的 MIN,我需要处理这个输入,以便它输出适合 alpha 通道的浮点数(0.0 到 1.0)。

关于如何做到这一点的任何建议?它可以包含在上面的 updateMouthMeter 方法中吗?

4

1 回答 1

0

这已经演变成 NSTimer 和更新 UIAnimations 的问题。我的 ViewController 中有 2 个 NSTimer:其中之一,sliderTimer,以 1.0(1 秒)的间隔更新进度滑块。另一个, meterTimer,更新 UIView 中 alpha 通道的 UIAnimation。sliderTimer 似乎干扰MeterTimer。在模拟器中,它在我的动画中创建了闪烁效果,并且在日志中,每秒顶部的浮点数有一个重复的峰值。这是我的代码的相关部分: .h 文件




@property (weak, nonatomic) IBOutlet UIImageView *mouthMeter;
- (void)updateSlider:(id) sender;<br/>
- (void)updateMouthMeter:(id) sender;

.m 文件

- (void)viewDidLoad{
....
self.sliderTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSlider:) userInfo:NULL repeats:YES];
self.meterTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateMouthMeter:) userInfo:NULL repeats:YES];
}

-(void)updateSlider : (id)sender {
//Update progressSlider about the music time
self.circularSliderPlayback.value = self.audioPlayer.currentTime;
}

-(void)updateMouthMeter : (id)sender {
[self.audioPlayer updateMeters];
float level = [self.audioPlayer peakPowerForChannel:0];
float alphaLevel = ((level * -1.0)/160);

NSLog(@"this is the alphaLevel %f",alphaLevel);

[UIView beginAnimations:nil context:NULL];
self.mouthMeter.alpha = alphaLevel;
[UIView commitAnimations];
}

我是 iOS 编程的新手,在同一个 .m 文件中使用 2 个 NSTimer 是否完全不行?我有什么选择可以摆脱sliderTimer的这种脉冲效应?
另外,我注意到sliderTimer也影响正在播放的音频.. 每秒有一个快速暂停。发生了什么事?

于 2013-07-06T10:54:10.140 回答