gpt4 book ai didi

iphone - 试图了解 AVAudioPlayer 和音频电平表

转载 作者:太空狗 更新时间:2023-10-30 03:48:19 30 4
gpt4 key购买 nike

我正在尝试了解 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]);

NSLog 的输出是0 -160.00 -160.001 -160.00 -160.00

现在根据 Apple“0 dB 的返回值表示满量程或最大功率;-160 dB 的返回值表示最小功率”那么这是否意味着这个声音处于最小功率?我不认为这是真的,因为音频片段是一个相当响亮的声音。我想我在这里遗漏了一些东西,如有任何澄清,我们将不胜感激。

最佳答案

您的代码有几个问题 - Jacques 已经指出了其中的大部分问题。

您必须调用 [audioPlayer updateMeters];每次读取值之前。你可能最好实例化一个 NSTimer .

声明一个 iVar NSTimer *playerTimer;在你的课上@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];

将这两个方法添加到您的类中:

-(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;
}

你应该可以开始了。

关于iphone - 试图了解 AVAudioPlayer 和音频电平表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10504428/

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