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

Bor*_*ski 4 avfoundation ios avaudiosession

我正在使用供应商的框架,其中移动应用程序中的音频录制是从何处启动的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];
}
Run Code Online (Sandbox Code Playgroud)

Rhy*_*man 6

这实现了@pesch的优秀答案(你应该接受它)。我不知道是否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
Run Code Online (Sandbox Code Playgroud)