2017-05-05 1 views
2

모바일 레벨의 오디오 녹음이 에서 시작되어 오디오 레벨 미터를 시작하기 위해 AVAudioRecorder을 찾을 수없는 공급 업체의 프레임 워크를 사용하고 있습니다. , 주 화면에 표시됩니다.iOS AVAudioSession, AVAudioRecorder 오디오 레벨 측정기에 액세스하는 방법

어떤 힌트 또는 제안 어떻게 이것을 달성 할 수 있습니까?

[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]; 
} 
+0

나는 'AVAudioSession'이 오디오 레벨 미터를 제공하지 않을 것이라고 생각하지만, 캡처 세션에'AVCaptureAudioDataOutput'을 추가하고 레벨을 직접 계산할 수 있습니다. –

+0

AVCaptureAudioDataOutput에 대해 자세히 설명해 주시겠습니까? –

+0

오디오 'AVCaptureDevice'에서 오디오 샘플을 보내드립니다. 샘플을 사용하여 레벨을 계산할 수 있습니다. –

답변

1

이 내용은 @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 
+0

죄송합니다. 최근에 페이지를 확인하지는 않았지만 도움을 주셔서 대단히 감사드립니다. 그게 내가 바라는거야. 그냥 channel.volume을 알기 때문에 어떤 이유로 더 이상 존재하지 않습니다. –

+0

오 - Xcode를 업데이트해야합니다. 다음 문서에도 계속 나와 있습니다. https://developer.apple.com/reference/avfoundation/avcaptureaudiochannel –

3

당신은 AVCaptureAudioChannelvolume 속성을 사용할 수 있습니다 : 어떻게 여기에 코드를 사용하고 AVAudioSession

에서 현재 마이크 레벨을 얻을 수 있습니까? documentation

볼륨 속성은 채널의 현재 볼륨 (게인)을 제공합니다.

+0

도움을 주셔서 대단히 감사합니다 –

관련 문제