SNV*_*NV7 5 iphone xcode objective-c avaudioplayer ipad
我正在尝试了解AVAudioPlayer和音频电平计量.我下面的内容是一个播放短音频声音的"AudioPlayer"对象.现在我想输出这个声音的功率(分贝).不知怎的,我不认为我这样做是对的.
audioPlayer.meteringEnabled = YES;
[audioPlayer play];
int channels = audioPlayer.numberOfChannels;
[audioPlayer updateMeters];
for (int i=0; i<channels; i++) {
//Log the peak and average power
NSLog(@"%d %0.2f %0.2f", i, [audioPlayer peakPowerForChannel:0],[audioPlayer averagePowerForChannel:0]);
Run Code Online (Sandbox Code Playgroud)
NSLog输出为0 -160.00 -160.00 1 -160.00 -160.00
现在根据Apple"0 dB的返回值表示满量程或最大功率; -160 dB的返回值表示最小功率"这是否意味着此声音处于最小功率?我不认为这是真的,因为音频片段是一个相当响亮的声音.我想我在这里遗漏了一些东西,任何澄清都会受到赞赏.
Rok*_*arc 10
你的代码有几个问题 - 雅克已经指出了大部分问题.
您必须[audioPlayer updateMeters];在读取值之前每次调用.你可能最好实例化一个NSTimer.
NSTimer *playerTimer;在你的班级宣布一个iVar @interface.
<AVAudioPlayerDelegate>在你的课程中采用也没有什么坏处,这样你就可以在玩家完成游戏后使计时器无效.
然后将您的代码更改为:
audioPlayer.meteringEnabled = YES;
audioPlayer.delegate = self;
if (!playerTimer)
{
playerTimer = [NSTimer scheduledTimerWithTimeInterval:0.001
target:self selector:@selector(monitorAudioPlayer)
userInfo:nil
repeats:YES];
}
[audioPlayer play];
Run Code Online (Sandbox Code Playgroud)
将这两种方法添加到您的类中:
-(void) monitorAudioPlayer
{
[audioPlayer updateMeters];
for (int i=0; i<audioPlayer.numberOfChannels; i++)
{
//Log the peak and average power
NSLog(@"%d %0.2f %0.2f", i, [audioPlayer peakPowerForChannel:i],[audioPlayer averagePowerForChannel:i]);
}
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
NSLog (@"audioPlayerDidFinishPlaying:");
[playerTimer invalidate];
playerTimer = nil;
}
Run Code Online (Sandbox Code Playgroud)
你应该好好去.
您几乎在声音开始后立即更新并询问米的值 - 这updateMeters可能在您发送后运行几十毫秒play。因此,如果剪辑开始时出现任何沉默,您很可能会得到正确的读数。您应该尝试延迟检查,并且可能还需要在检查值之前在循环updateMeters 内发送。
您也永远不会真正获得大于 0 的通道的仪表值,因为无论i循环中的值是什么,您都会传递 0。我认为你的意思是这样做:
for (int currChan = 0; currChan < channels; currChan++) {
//Log the peak and average power
NSLog(@"%d %0.2f %0.2f", currChan, [audioPlayer peakPowerForChannel:currChan], [audioPlayer averagePowerForChannel:currChan]);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5337 次 |
| 最近记录: |