2012-05-08 49 views
5

Tôi đang cố gắng hiểu AVAudioPlayer và đo mức âm thanh. Những gì tôi có dưới đây là một đối tượng "AudioPlayer" đang phát âm thanh ngắn. Bây giờ tôi muốn xuất ra sức mạnh của âm thanh này (decibel). Bằng cách nào đó tôi không nghĩ rằng tôi đang làm điều này đúng.Đang cố gắng hiểu AVAudioPlayer và đo mức âm thanh

Các NSLog đầu ra của việc này là 0 -160,00 -160,00 1 -160,00 -160,00

Bây giờ theo Apple "Một giá trị trả về từ 0 dB chỉ ra quy mô đầy đủ, hoặc sức mạnh tối đa; lợi nhuận giá trị -160 dB cho biết công suất tối thiểu "Vậy điều này có nghĩa là âm thanh này ở mức công suất tối thiểu? Tôi không nghĩ điều này là đúng bởi vì đoạn âm thanh là một âm thanh khá lớn. Tôi nghĩ rằng tôi đang thiếu một cái gì đó ở đây, bất kỳ làm rõ sẽ được đánh giá cao.

Trả lời

3

Bạn đang cập nhật và sau đó yêu cầu giá trị của đồng hồ gần như ngay sau khi âm thanh bắt đầu - updateMeters có thể chạy vài chục mili giây sau khi bạn gửi play. Vì vậy, nếu có bất kỳ sự im lặng nào ở đầu clip, bạn có thể đọc được chính xác. Bạn nên thử trì hoãn việc kiểm tra của mình và bạn cũng có thể cần gửi updateMetersbên trong vòng lặp, ngay trước khi bạn kiểm tra các giá trị.

Bạn cũng chưa bao giờ thực sự nhận được giá trị đồng hồ cho kênh> 0, vì bạn vượt qua 0 bất kể giá trị của i nằm trong vòng lặp. Tôi nghĩ bạn muốn làm điều này:

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]); 
} 
9

Có một số vấn đề với mã của bạn - Jacques đã chỉ ra hầu hết các vấn đề đó.

Bạn phải gọi số [audioPlayer updateMeters]; mỗi lần trước khi đọc các giá trị. Có thể bạn sẽ tốt nhất là tắt một số NSTimer.

Khai báo một iVar NSTimer *playerTimer; trong lớp học của bạn @interface.

Ngoài ra, bạn không thể làm mất hiệu lực để áp dụng <AVAudioPlayerDelegate> trong lớp học của mình để bạn có thể làm mất hiệu lực bộ hẹn giờ sau khi trình phát phát xong.

Sau đó thay đổi mã của bạn để:

audioPlayer.meteringEnabled = YES; 
audioPlayer.delegate = self; 

if (!playerTimer) 
{ 
    playerTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 
        target:self selector:@selector(monitorAudioPlayer) 
       userInfo:nil 
       repeats:YES]; 
} 

[audioPlayer play]; 

Thêm hai phương pháp này để lớp học của bạn:

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

Và bạn sẽ được tốt để đi.

Các vấn đề liên quan