AudioKit滚动波形图未显示在物理设备上

时间:2018-07-09 17:21:00

标签: objective-c iphone audio-recording audiokit

我一直在尝试AudioKit,并制作了一个示例应用程序来尝试从回放中绘制录制的音频和音频。我看到一个问题,当我录制或播放音频时,滚动波形没有显示在设备的视图中。但是,它在sim(11.4)上显示的很好。我在下面提供了录音视图控制器代码作为上下文,以说明我在录制音频时如何实现此目的。

我们将不胜感激。

RecordingVC.m代码:

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self setupConfig];
    [self setupUI];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void) setupUI
{
    //Configure waveform view
    self.recordingPlotView.gain = 2;
    self.recordingPlotView.backgroundColor = [UIColor colorWithRed: .10 green: .10 blue: .10 alpha: 1];
    self.recordingPlotView.color = [UIColor colorWithRed: .44 green: .44 blue: .44 alpha: 1];
    self.recordingPlotView.plotType = EZPlotTypeRolling;
    self.recordingPlotView.shouldFill = YES;
    self.recordingPlotView.shouldMirror = YES;
    [self.view addSubview: self.recordingPlotView];
}

- (void) setupConfig
{
    self.isRecording = NO;
    [AKSettings setAudioInputEnabled: true];
    [AKSettings setPlaybackWhileMuted: true];
    [AVAudioSession.sharedInstance setCategory: AVAudioSessionCategoryAmbient withOptions: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker error: nil];

    self.mic = [[EZMicrophone alloc] initWithMicrophoneDelegate: self];
}

#pragma mark - EZMicrophone Delegate methods
- (void)   microphone:(EZMicrophone *)microphone
     hasAudioReceived:(float **)buffer
       withBufferSize:(UInt32)bufferSize
 withNumberOfChannels:(UInt32)numberOfChannels
{
    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{

        [weakSelf.recordingPlotView updateBuffer:buffer[0]
                                   withBufferSize:bufferSize];
    });
}

- (void)   microphone:(EZMicrophone *)microphone
        hasBufferList:(AudioBufferList *)bufferList
       withBufferSize:(UInt32)bufferSize
 withNumberOfChannels:(UInt32)numberOfChannels
{
    if (self.isRecording)
    {
        [self.recorder appendDataFromBufferList:bufferList
                                 withBufferSize:bufferSize];
    }
}

#pragma mark - EZRecorder Delegate methods
- (void)recorderDidClose:(EZRecorder *)recorder
{
    self.recorder.delegate = nil;
}

#pragma mark - Utils
- (NSArray *)applicationDocuments
{
  return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
}


- (NSString *)applicationDocumentsDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

- (NSURL *)testFilePathURL
{
    return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@",
                                   [self applicationDocumentsDirectory],
                                   @"test2.m4a"]];
}

#pragma mark - user Interaction

- (IBAction)playButtonTapped:(id)sender {
    if (self.isRecording)
    {
        self.isRecording = NO;
        self.playButton.titleLabel.text = @"Record";
        [self.mic stopFetchingAudio];
    }
    else
    {
        self.isRecording = YES;
        self.playButton.titleLabel.text = @"Pause";
        [self.mic startFetchingAudio];
        self.recorder = [EZRecorder recorderWithURL: [self testFilePathURL] clientFormat: [self.mic audioStreamBasicDescription] fileType: EZRecorderFileTypeM4A delegate: self];
    }
}
- (IBAction)stopButtonTapped:(id)sender {
    if (self.isRecording)
    {
        self.isRecording = NO;
        self.playButton.titleLabel.text = @"Record";
        [self.mic stopFetchingAudio];
        [self.recorder closeAudioFile];
    }
    [self.recordingPlotView clear];
    self.recorder = nil;
}

@end

RecordingVC.h代码:

#import <UIKit/UIKit.h>
@import AudioKit;
@import AudioKitUI;

@interface FirstViewController : UIViewController <EZMicrophoneDelegate, EZRecorderDelegate>

@property (strong, nonatomic) IBOutlet EZAudioPlot *recordingPlotView;
@property (nonatomic, strong) EZMicrophone* mic;
@property (nonatomic, strong) EZRecorder* recorder;
@property (nonatomic, assign) BOOL isRecording;
@property (strong, nonatomic) IBOutlet UIButton *playButton;

@end

小更新: 通过在界面生成器中设置增益,我设法在设备上显示了回放波形,即使我在viewDidLoad()期间在代码中进行了设置。

我已经尝试对录制VC(上面的代码)执行相同的操作(在界面构建器中为绘图设置增益),但这确实解决了此问题,就像对回放VC一样。

1 个答案:

答案 0 :(得分:1)

我运行了您的项目,并且它在设备上与模拟器相同,但是模拟器的麦克风是计算机的,并且比设备上的麦克风灵敏得多,因此我必须将增益设置得更高:

self.recordingPlotView.gain = 20;

在我注意到波形之前。

enter image description here