UIAnimation基于AVAudioPlayer的peakPowerForChannel

时间:2013-07-05 18:50:35

标签: ios avaudioplayer alpha uianimation

我想基于UIImageView的peakPowerForChannel为AVAudioPlayer中的png图像的alpha设置动画。我没有任何错误或崩溃,但它没有工作。以下是(我相信)我的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的最大值和-160dB的MIN,我需要处理这个输入,以便它输出一个适合的浮点数(0.0到1.0) alpha通道。

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

1 个答案:

答案 0 :(得分:0)

这已经演变为NSTimer的问题并更新了UIAnimations。我的ViewController中有2个NSTimers:其中一个 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个NSTimers是完全禁止的吗?我有什么选择摆脱 sliderTimer 的脉冲效果?
另外,我注意到 sliderTimer 也影响正在播放的音频..那里每秒钟都会快速停顿。什么在进行?