首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于AVAudioPlayer peakPowerForChannel的UIAnimation

基于AVAudioPlayer peakPowerForChannel的UIAnimation
EN

Stack Overflow用户
提问于 2013-07-06 02:50:35
回答 1查看 429关注 0票数 0

我想在一个基于AVAudioPlayer的peakPowerForChannel的UIImageView中动画一个png图像的alpha。我没有得到任何错误或崩溃,但它不工作。下面是(我相信的)我的ViewController代码的相关部分:

.h

代码语言:javascript
复制
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
@property(getter = isMeteringEnabled) BOOL meteringEnabled;
@property (weak, nonatomic) IBOutlet UIImageView *mouthMeter;
- (void)updateMouthMeter:(id) sender;

.m

代码语言:javascript
复制
- (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,我需要处理此输入,以便它输出适合alpha通道的浮点数(0.0到1.0)。

对如何做到这一点有什么建议吗?它可以包含在上面的updateMouthMeter方法中吗?

EN

回答 1

Stack Overflow用户

发布于 2013-07-06 18:54:10

这已经演变成了NSTimer和更新UIAnimations的问题。我的ViewController中有两个NSTimers :其中一个sliderTimer以1.0 (1秒)的间隔更新进度滑块。另一个是meterTimer,用于更新UIView中alpha通道的UIAnimation。sliderTimer似乎正在干扰meterTimer。

在模拟器中,它在我的动画中创建了一个闪烁的效果,在日志中,每秒在顶部的浮点数中都有一个重复的峰值。以下是我的代码的相关部分:

代码语言:javascript
复制
.h file
代码语言:javascript
复制
@property (weak, nonatomic) IBOutlet UIImageView *mouthMeter;
- (void)updateSlider:(id) sender;<br/>
- (void)updateMouthMeter:(id) sender;

.m文件

代码语言:javascript
复制
- (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文件中放入两个NSTimers是完全不可取的吗?要摆脱sliderTimer的这种脉冲效应,我有哪些选择

此外,我还注意到sliderTimer也会影响正在播放的音频。每一秒都会有一个短暂的停顿。怎么回事?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17495216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档