iOS AVAudioSession,如何访问AVAudioRecorder的音频电平表

iOS AVAudioSession, how to access AVAudioRecorder audio-level meter

我正在使用来自供应商的框架,其中移动应用程序中的音频记录是从 AVAudioSession 启动的,并且找不到任何地方 AVAudioRecorder 来启动音频电平表,显示在主屏幕上。

任何提示或建议如何实现这一点?如何从 AVAudioSession

获取当前麦克风电平

这是正在使用的代码:

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {

    if (granted) {
        dispatch_async(self.audioSessionQueue, ^{
            NSError *error;
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];
            [[AVAudioSession sharedInstance] setActive:YES error:&error];

            self.audioCaptureSession = [[AVCaptureSession alloc] init];
            [self.audioCaptureSession beginConfiguration];
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
            AVCaptureDeviceInput *audioCaptureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error];

    if ([self.audioCaptureSession canAddInput:audioCaptureDeviceInput])
            {
                [self.audioCaptureSession addInput:audioCaptureDeviceInput];
            }
    else
            {
                NSLog(@"Couldn't add audio capture device input.");

                [self.audioCaptureSession commitConfiguration];
                return;
            }

            [self.audioCaptureReader setResultsDelegate:self queue:dispatch_get_main_queue()];
            [self.audioCaptureSession addOutput:self.audioCaptureReader.captureOutput];

[self.audioCaptureSession commitConfiguration];
[self.audioCaptureSession startRunning];
}

可以在AVCaptureAudioChannel中使用volume属性吗?这是 link 到 documentation

音量属性提供频道的当前音量(增益)。

这实现了 @pesch's 很好的答案(你应该接受它)。我不知道 AVCaptureAudioDataOutput 是否绝对必要,但我不知道如何才能获得 AVCaptureConnection.

#import <AVFoundation/AVFoundation.h>

@interface ViewController () <AVCaptureAudioDataOutputSampleBufferDelegate>

@property (nonatomic) AVCaptureSession *session;
@property (nonatomic) float averagePowerLevel;
@property (nonatomic) float volume;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.session = [[AVCaptureSession alloc] init];

    NSError *error;
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];
    // TODO: check audioInput != nil and error
    [self.session addInput:audioInput];

    AVCaptureAudioDataOutput *output = [[AVCaptureAudioDataOutput alloc] init];
    [output setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
    [self.session addOutput:output];

    [self.session startRunning];
}

// MARK: - AVCaptureAudioDataOutputSampleBufferDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    AVCaptureAudioChannel *channel = connection.audioChannels[0];


    self.averagePowerLevel = channel.averagePowerLevel;    // NB: not KVO-able!
    self.volume = channel.volume;    // KVO-able?

    NSLog(@"averagePowerLevel: %.2lf", self.averagePowerLevel);
}

@end