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
我正在使用来自供应商的框架,其中移动应用程序中的音频记录是从 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