簡體   English   中英

iPhone-獲取當前點的音頻幅度

[英]iPhone - get amplitude of audio at current point

首先,我對音頻處理了解不多。 我知道使用Core Audio,您可以獲得有關播放曲目的信息。

我的目標是在SpriteKit中建立一個節點,以iTunes當前歌曲的當前振幅/響度作為縮放比例(例如,縮放比例應在最大音量時為1.0 ,在最小音量時為0.0 )。

我可以進行節點編程(將xScaleyScale設置為float amp )。 我的問題與獲得amp的價值有關。

這是我的代碼:

AVAudioPlayer *somePlayer = [AVAudioPlayer new];
__autoreleasing NSError* error;
somePlayer = [somePlayer initWithContentsOfURL:[[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] valueForProperty:MPMediaItemPropertyAssetURL] error:&error];
somePlayer.currentTime = [[MPMusicPlayerController systemMusicPlayer] currentPlaybackTime];
somePlayer.volume = 0;
[somePlayer play];
[somePlayer setMeteringEnabled:YES];
[somePlayer updateMeters];
NSMutableArray* amps = [NSMutableArray array];
if (error != nil) {
    NSLog(@"error: %@", error.debugDescription);
}
for (int i = 0; i < somePlayer.numberOfChannels; i++) {
    [amps addObject:@([somePlayer averagePowerForChannel:i]);
    NSLog(@"Amplitude: %f db for channel %i", [somePlayer averagePowerForChannel:i], i);
}
float amp = 0;
for (NSNumber *x in amps) {
    amp += [x floatValue];
}
amp /= amps.count;
NSLog(@"amp: %f", amp);
// set xScale and yScale to "amp"
[somePlayer stop];

我得到的是-120 dB和滯后的恆定輸出(這是我的update方法)。 在我的iPhone 6上,通常為60 fps,為10-11。知道如何解決此問題嗎? 我在網上搜索了一個小時,但一無所獲。

我不確定我是否正確解釋了您的代碼,但是看起來您可能正在用每一幀實例化您的播放器來解釋其緩慢性。 您需要提前設置播放器。 然后在您的計時器上,在獲取averagePowerForChannel之前立即調用updateMeters。 我對spiteKit不熟悉,因此我只將UIKit與viewDidLoad和displayLink一起用作計時器。

@interface ViewController (){
    AVAudioPlayer *somePlayer;
    UIView *redView;
    UIView *blueView;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *eggman = [[NSBundle mainBundle]URLForResource:@"Eggman" withExtension:@"mp3"];
    somePlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:eggman error:NULL];
    [somePlayer setMeteringEnabled:YES];
    [somePlayer play];


    [self addViews];
    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateViews)];
    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}


-(void)animateViews{

    [somePlayer updateMeters];
    float left_db = [somePlayer averagePowerForChannel:0];
    float right_db;
    if (somePlayer.numberOfChannels > 1) {
        right_db = [somePlayer averagePowerForChannel:1];
    }
    else{
        right_db = left_db;
    }


    float blueScale = db_to_scale(left_db);
    float redScale = db_to_scale(right_db);
    float vert = self.view.bounds.size.height - 80;

    blueView.center = CGPointMake(blueView.center.x, vert - (vert * blueScale));
    redView.center = CGPointMake(redView.center.x, vert - (vert * redScale));

}
float db_to_scale(float decibles){
    return powf(10, (0.05 * decibles));
}
-(void)addViews{
    blueView = [[UIView alloc]initWithFrame:CGRectMake(80, 80, 80, 80)];
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];

    redView = [[UIView alloc]initWithFrame:CGRectMake(160, 80, 80, 80)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM