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)
这实现了@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)